题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1556
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 10005;
int n;
long long tree[maxn];
int lowbit(int i){
return i&(-i);
}
void update(int i,int add){
while(i<=n){
tree[i]+=add;
i += lowbit(i);
}
}
long long getSum(int i){ //求的是 1 到 i 号的和 (从1开始计数,i >= 1),则求 i 处的值即为:getSum(i) - getSum(i-1)
long long sum = 0;
while(i>0){
sum += tree[i];
i -= lowbit(i);
}
return sum;
}
int main()
{
while(~scanf("%d",&n) && n!=0){
memset(tree,0,sizeof(tree));
for(int i=0;i<n;i++){
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
update(i,1);
}
}
for(int i=1;i<=n;i++){
cout<<getSum(i)-getSum(i-1)<<" ";
}
cout<<endl;
}
return 0;
}