FZU 2171(线段树的延迟标记)
题意:容易理解。
分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞,
然后我就一直没去碰线段树的题了,但是我现在发现这种做法不是很好,导致我现在的思维受到了很大的局限性,所以我现在想纠正这种错误,该做的就应该去做,就像
高中一样不能太偏科!一道比较简单的线段树延迟标记!
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> struct node{ int l , r; int sum; int color; }tree[100005*4]; int n,len,a[100005]; void buildTree(int l,int r,int n) { int mid = (l + r) >> 1; tree[n].l = l; tree[n].r = r; tree[n].color = 0; if(l == r) { tree[n].sum = a[l]; return ; } buildTree(l,mid,n*2); buildTree(mid+1,r,n*2+1); tree[n].sum = tree[n*2].sum + tree[n*2+1].sum; } void pushDown(int n) { tree[n*2].sum = tree[n*2].sum - (tree[n*2].r - tree[n*2].l + 1) * tree[n].color; tree[n*2+1].sum = tree[n*2+1].sum - (tree[n*2+1].r - tree[n*2+1].l + 1) * tree[n].color; tree[n*2].color += tree[n].color; tree[n*2+1].color += tree[n].color; } int calSum(int x,int y,int n) { int mid = (tree[n].l + tree[n].r) >> 1; if(tree[n].l==x && tree[n].r == y) return tree[n].sum; if(tree[n].color) { pushDown(n); tree[n].color = 0; } if(y <= mid) return calSum(x , y , n*2); else if(x>mid) return calSum(x , y , n*2+1); else return calSum(x , mid , n*2) + calSum(mid+1 , y , n*2+1); } void update(int x , int y , int n) { int mid = (tree[n].l + tree[n].r) >> 1; if(tree[n].l == x && tree[n].r == y) { tree[n].sum = tree[n].sum - (tree[n].r - tree[n].l + 1); tree[n].color ++; return ; } if(y <= mid) update(x , y , n*2); else if(x > mid) update(x , y , n*2+1); else { update(x , mid , n*2); update(mid+1 , y , n*2+1); } tree[n].sum = tree[n*2].sum + tree[n*2 + 1].sum; } int main() { int i,q,x; while(scanf("%d%d%d",&n,&len,&q)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); buildTree(1,n,1); while(q--) { scanf("%d",&x); printf("%d\n",calSum(x , x+len-1 , 1)); update(x , x+len-1 , 1); } } return 0; }
posted on 2014-04-28 12:21 后端bug开发工程师 阅读(724) 评论(0) 编辑 收藏 举报