Color the ball(HDU1556)树状数组

时间:2023-03-09 15:21:50
Color the ball(HDU1556)树状数组

每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数。

树状数组,上下区间更新都可以,差别不大。

1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计

#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int ans[maxn],Tree[maxn],n;
inline int lowbit(int x) //计算2^k
{
return (x&-x);
}
void add(int x,int value)
{
for(int i=x; i<maxn; i+=lowbit(i))
Tree[i]+=value;
}
void up(int x,int val)
{
while(x>)
{
Tree[x]+=val;
x-=lowbit(x);
}
}
int get(int x)
{
int sum=;
while(x<=n)
{
sum+=Tree[x];
x+=lowbit(x);
}
return sum;
}
int main()
{
int x,y;
while(~scanf("%d",&n)&&n)
{
memset(Tree,,sizeof(Tree));
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
up(y,);
up(x-,-);
}
for(int i=;i<=n;i++)
printf("%d%c",get(i),i==n?'\n':' ');
}
return ;
}

2.对于[x,y]区间,对第y+1位减1,第x位加1,之后向下统计

#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int ans[maxn],Tree[maxn];
inline int lowbit(int x) //计算2^k
{
return (x&-x);
}
void add(int x,int value)
{
for(int i=x; i<maxn; i+=lowbit(i))
Tree[i]+=value;
}
int get(int x)
{
int sum=;
for(int i=x; i>; i-=lowbit(i))
sum+=Tree[i];
return sum;
}
int main()
{
int n,x,y;
while(~scanf("%d",&n)&&n)
{
memset(Tree,,sizeof(Tree));
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,);
add(y+,-);
}
for(int i=;i<=n;i++)
printf("%d%c",get(i),i==n?'\n':' ');
}
return ;
}