线段树之区间更新Color the ball
注意:
1.此处要求给出气球被涂色几遍,所以pushup为求和,pushup可以写出,也可以直接嵌进调用的函数中
2.pushdown 也是求和,但是f中存放的是其子结点区间上的总数
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int N=1e5+5; int f[N<<2]; int lazy[N<<1]; int n; void build(int root,int left,int right){ lazy[root]=0; if(left==right){ f[root]=0; return; } int rt,mid; rt=root<<1; mid=(left+right)>>1; build(rt,left,mid); build(rt+1,mid+1,right); f[root] = f[rt]+f[rt+1]; } void pushdown(int root,int left,int right){ int rt,mid; rt=root<<1; mid=(left+right)>>1; lazy[rt]+=lazy[root]; lazy[rt+1]+=lazy[root]; f[rt]+=lazy[root]*(mid-left+1); f[rt+1]+=lazy[root]*(right-mid); lazy[root]=0; } void update(int root,int left,int right,int uleft,int uright,int val){ if(uleft<=left&&uright>=right){ lazy[root]+=val; f[root]+=val*(right-left+1); return; } pushdown(root,left,right); int mid=(left+right)>>1; int rt=root<<1; if(uleft<=mid){ update(rt,left,mid,uleft,uright,val); } if(uright > mid){ update(rt+1,mid+1,right,uleft,uright,val); } f[root]=f[rt]+f[rt+1]; } int query(int root,int left,int right,int qleft,int qright){ if(qleft<=left&&qright>=right){ return f[root]; } if(lazy[root]!=0){ pushdown(root,left,right); } int mid=(left+right)>>1; int ans=0; int rt=root<<1; if(qleft<=mid){ ans+=query(rt,left,mid,qleft,qright); } if(qright>mid){ ans+=query(rt+1,mid+1,right,qleft,qright); } return ans; } int main(){ int x,y; while(cin>>n&&n!= 0) { build(1,1,n); for(int i=1;i<=n;i++){ cin>>x>>y; update(1,1,n,x,y,1); } cout<<query(1,1,n, 1,1); for(int i=2;i<=n;i++) cout<<" "<<query(1, 1,n,i,i); cout<<endl; } return 0; }

浙公网安备 33010602011771号