hihocoder1078 线段树的区间修改
2017-06-03 08:25
267 查看
线段树
题目传送门线段树区间改值,需要用到lazy思想,不然很容易TLE。不会的小伙伴戳这里
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 100000 using namespace std; struct cai{ int l; int r; int sum; }; cai t[4*MAXN+5]; int a[MAXN+5],lazy[4*MAXN+5],n,m,l,r,q,f,w,ans; void build(int l,int r,int num) { t[num].l=l; t[num].r=r; if (l==r) { t[num].sum=a[l]; return; } else { build(l,(l+r)/2,num*2); build((l+r)/2+1,r,num*2+1); t[num].sum=t[num*2].sum+t[num*2+1].sum; } } void change(int l,int r,int w,int num) { if (t[num].l>=l&&t[num].r<=r) { lazy[num]=w; t[num].sum=(t[num].r-t[num].l+1)*lazy[num]; } else { if (lazy[num]) { lazy[num*2]=lazy[num*2+1]=lazy[num]; t[num*2].sum=(t[num*2].r-t[num*2].l+1)*lazy[num]; t[num*2+1].sum=(t[num*2+1].r-t[num*2+1].l+1)*lazy[num]; lazy[num]=0; } int mid=(t[num].l+t[num].r)/2; if (l<=mid) change(l,r,w,num*2); if (mid<r) change(l,r,w,num*2+1); t[num].sum=t[num*2].sum+t[num*2+1].sum; } } int search(int l,int r,int num) { if (t[num].l>=l&&t[num].r<=r) return t[num].sum; int mid=(t[num].l+t[num].r)/2; if (lazy[num]) { lazy[num*2]=lazy[num*2+1]=lazy[num]; t[num*2].sum=(t[num*2].r-t[num*2].l+1)*lazy[num]; t[num*2+1].sum=(t[num*2+1].r-t[num*2+1].l+1)*lazy[num]; lazy[num]=0; } int ans=0; if (l<=mid) ans+=search(l,r,num*2); if (mid<r) ans+=search(l,r,num*2+1); return ans; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); scanf("%d",&q); for (int i=1;i<=q;i++) { scanf("%d%d%d",&f,&l,&r); if (f) { scanf("%d",&w); change(l,r,w,1); } else { ans=search(l,r,1); printf("%d\n",ans); } } return 0; }
相关文章推荐
- hihocoder 1078 线段树的区间修改 (线段树 区间更新 模板)
- [HihoCoder]#1078 : 线段树的区间修改
- hihocoder 1078 线段树的区间修改 java实现
- hihocoder 1078 线段树的区间修改线段树(区间修改 区间求和)
- hihoCoder 1078 线段树的区间修改
- hihoCoder 1078 线段树的区间修改
- hihocoder 1078 : 线段树的区间修改
- hihocoder 1078 线段树的区间修改
- hihocoder1078线段树修改区间查询区间(懒标记)
- hihoCoder 1078 : 线段树的区间修改
- hihoCoder 1078 : 线段树的区间修改
- hihocoder #1078 : 线段树的区间修改
- #1078 : 线段树的区间修改
- hiho一下第二十周 #1078 : 线段树的区间修改 【线段树】
- hihoCoder #1078 : 线段树的区间修改
- hiho #1078 : 线段树的区间修改
- hiho1078 线段树的区间修改
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
- hihoCoder #1078 : 线段树的区间修改
- hihocoder 1078# 线段树的区间修改模版