您的位置:首页 > 其它

HDU1556 color the ball (树状数组)

2017-09-02 19:17 323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1556

思路:直接用树状数组即可,因为更新的是区间,所以需要更新2次。

比如更新 [1,3] ,n的大小为6,那么update(1,1)其实是更新了[1,6],所以需要将[4,6]的每个元素减一,即update(4,-1).

#include<iostream>
#include<stdio.h>
#define maxn 100005
#define lowbit(x) ((x)&(-(x)))
using namespace std;
int n,a,b,color[maxn];
void update(int x,int y)
{
while(x<=n)
{
color[x]+=y;
x+=lowbit(x);
}
}
int quary(int x)
{
int sum=0;
while(x>0)
{
sum+=color[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int x=0;x<=n;x++) color[x]=0;
for(int x=0;x<n;x++)
{
scanf("%d%d",&a,&b);
update(a,1);update(b+1,-1);
}
for(int x=1;x<n;x++)
printf("%d ",quary(x));
printf("%d\n",quary(n));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: