就是裸的区间更新:
相对于直观的线段树的区间更新,树状数组的区间更新原理不太相同:由于数组中的一个结点控制的是一块区间,当遇到更新【l,r】时,先将所有能控制到 l 的结点给更新了,这样一来就是一下子更新到【l,+无穷】了,所以需要将【r+1,+无穷】区间的更新消去,那么同理,【r+1,+无穷】反向减掉相同的数即可
#include<bits/stdc++.h> using namespace std; #define maxn 100005 int bit[maxn],a,b,n; void add(int x,int num){ for(int i=x;i<=100000;i+=i&-i) bit[i]+=num; } int query(int x){ int res=0; for(int i=x;i;i-=i&-i) res+=bit[i]; return res; } int main(){ while(scanf("%d",&n),n){ memset(bit,0,sizeof bit); for(int i=1;i<=n;i++){ scanf("%d%d",&a,&b); add(a,1);add(b+1,-1); } for(int i=1;i<n;i++) printf("%d ",query(i)); printf("%d\n",query(n)); } }