题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1556
题意:
给一堆气球涂色,每次涂色的区间为[a, b],涂N次,问每个气球被涂了多少次。
思路:
利用树状数组的特点,但要注意的是当从区间a涂到b时,b之后的数组要减1次,这样在sum取结果时才不会出错。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define lowbit(x) x & (-x)
const int M = 100020;
int tree[M], n;
void add(int a, int b)
{
while(a <= n)
{
tree[a] += b;
a += lowbit(a);
}
}
int sum(int a)
{
int total = 0;
while(a > 0)
{
total += tree[a];
a -= lowbit(a);
}
return total;
}
main()
{
while(cin >> n && n)
{
memset(tree, 0, sizeof(tree));
for(int i = 1; i <= n; i++)
{
int a, b;
scanf("%d %d", &a, &b);
add(a, 1);
add(b + 1, -1);
}
cout << sum(1);
for(int i = 2; i <= n; i++)
printf(" %d", sum(i));
cout << endl;
}
}