原题http://acm.hdu.edu.cn/showproblem.php?pid=1556
每次从a号气球到b号气球涂色,最后问每个气球被涂了多少次
感觉自己对树状数组的理解好肤浅= =加油!
#include<iostream>
#include<cstdio>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int maxn = 100005;
int c[maxn+1];
int n ,a,b;
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int sum = 0;
while(x>0){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
void add(int po,int x){
while(po<=maxn){
c[po]+=x;
po+=lowbit(po);
}
}
int main()
{
while(cin>>n&&n){
memset(c,0,sizeof(c));
for(int i = 0;i < n;i++){
scanf("%d%d",&a,&b);
add(a,1); //从a号到最后一个气球都涂了色
add(b+1,-1); //其实b+1号到最后一个都没有涂色,要减一次
}
for(int i = 1;i <= n; i++)
if(i==n)printf("%d\n",sum(i));
else printf("%d ",sum(i));
}
return 0;
}