解题思路:
应用树状数组的一个小技巧,每次区间加1的时候只需要在左端点加1,右端点加-1,这样询问的时候便可以直接求和。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = 100000 + 10;
int C[MAXN];
int n;
int lowbit(int x)
{
return x & (-x);
}
void add(int x, int a)
{
while(x <= n)
{
C[x] += a;
x += lowbit(x);
}
}
int sum(int x)
{
int res = 0;
while(x > 0)
{
res += C[x];
x -= lowbit(x);
}
return res;
}
int main()
{
int a, b;
while(scanf("%d", &n)!=EOF)
{
if(n == 0)
break;
memset(C, 0, sizeof(C));
for(int i=0;i<n;i++)
{
scanf("%d%d", &a, &b);
add(a, 1);
add(b + 1, -1);
}
for(int i=1;i<n;i++)
printf("%d ", sum(i));
printf("%d\n", sum(n));
}
return 0;
}