Color the ball(HDU1556)树状数组
每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数。
树状数组,上下区间更新都可以,差别不大。
1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计
#include<bits/stdc++.h> using namespace std; const int maxn=100000+10; int ans[maxn],Tree[maxn],n; inline int lowbit(int x) //计算2^k { return (x&-x); } void add(int x,int value) { for(int i=x; i<maxn; i+=lowbit(i)) Tree[i]+=value; } void up(int x,int val) { while(x>0) { Tree[x]+=val; x-=lowbit(x); } } int get(int x) { int sum=0; while(x<=n) { sum+=Tree[x]; x+=lowbit(x); } return sum; } int main() { int x,y; while(~scanf("%d",&n)&&n) { memset(Tree,0,sizeof(Tree)); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); up(y,1); up(x-1,-1); } for(int i=1;i<=n;i++) printf("%d%c",get(i),i==n?'\n':' '); } return 0; }
2.对于[x,y]区间,对第y+1位减1,第x位加1,之后向下统计
#include<bits/stdc++.h> using namespace std; const int maxn=100000+10; int ans[maxn],Tree[maxn]; inline int lowbit(int x) //计算2^k { return (x&-x); } void add(int x,int value) { for(int i=x; i<maxn; i+=lowbit(i)) Tree[i]+=value; } int get(int x) { int sum=0; for(int i=x; i>0; i-=lowbit(i)) sum+=Tree[i]; return sum; } int main() { int n,x,y; while(~scanf("%d",&n)&&n) { memset(Tree,0,sizeof(Tree)); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); add(x,1); add(y+1,-1); } for(int i=1;i<=n;i++) printf("%d%c",get(i),i==n?'\n':' '); } return 0; }