Color the ball(HDU1556)树状数组

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

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

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

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
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>0)
    {
        Tree[x]+=val;
        x-=lowbit(x);
    }
}
int get(int x)
{
    int sum=0;
    while(x<=n)
    {
        sum+=Tree[x];
        x+=lowbit(x);
    }
    return sum;
}
int main()
{
    int x,y;
    while(~scanf("%d",&n)&&n)
    {
        memset(Tree,0,sizeof(Tree));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            up(y,1);
            up(x-1,-1);
        }
        for(int i=1;i<=n;i++)
            printf("%d%c",get(i),i==n?'
':' ');
    }
    return 0;
}
View Code

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

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
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=0;
    for(int i=x; i>0; i-=lowbit(i))
        sum+=Tree[i];
    return sum;
}
int main()
{
    int n,x,y;
    while(~scanf("%d",&n)&&n)
    {
        memset(Tree,0,sizeof(Tree));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,1);
            add(y+1,-1);
        }
        for(int i=1;i<=n;i++)
            printf("%d%c",get(i),i==n?'
':' ');
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/weimeiyuer/p/8358335.html