FZU 2171(线段树的延迟标记)
生活随笔
收集整理的這篇文章主要介紹了
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);elsereturn 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; }?
?
轉載于:https://www.cnblogs.com/jiangjing/p/3696080.html
總結
以上是生活随笔為你收集整理的FZU 2171(线段树的延迟标记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解Adorner Layer(zz)
- 下一篇: BadgeView(View上添加提醒)