1. 程式人生 > >樹狀陣列模板題—hdu1166+poj2352

樹狀陣列模板題—hdu1166+poj2352

hdu1166 敵兵佈陣

樹狀陣列的第一道題,實質就是copy學長的程式碼,鄙視一下自己鄙視

#include<cstdio>
#include<cstring>
using namespace std;
const int num=50005;
int n,bit[num];
int lowbit(int a)
{
    return a&(-a);
}
void init()
{
    int i;
    for(i=1;i<=n;i++)
        bit[i]=0;
}
void updata(int x,int add)
{
    while(x<=n)
    {
        bit[x]+=add;
        x+=lowbit(x);
    }
}
int sum(int a)
{
    int ans=0;
    while(a>0)
    {
        ans+=bit[a];
        a-=lowbit(a);
    }
    return ans;
}
int main()
{
    int t,i,k,a,b;
    char s[10];
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);
    for(k=1;k<=t;k++)
    {
        scanf("%d",&n);
        init();
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a);
            updata(i,a);
        }
        printf("Case %d:\n",k);
        while(scanf("%s",s))
        {
            if(strcmp(s,"End")==0)
                break;
            else if(strcmp(s,"Add")==0)
            {
                scanf("%d%d",&a,&b);
                updata(a,b);
            }
            else if(strcmp(s,"Sub")==0)
            {
                scanf("%d%d",&a,&b);
                updata(a,-b);
            }
            else if(strcmp(s,"Query")==0)
            {
                scanf("%d%d",&a,&b);
                printf("%d\n",sum(b)-sum(a-1));
            }
        }
    }
    return 0;
}


思路:因為資料輸入是按照y座標遞增,y座標相同時,按照x座標遞增輸入,用樹狀陣列對x座標進行統計。

注意:座標是從0開始的,而樹狀陣列是從1開始的,用樹狀陣列的a的值表示當前在直線x=a-1上的的星星個數。

#include<cstdio>
#include<cstring>
using namespace std;
const int num=32005;
int n,cnt[num],level[15005];
int lowbit(int x)
{
    return x&(-x);
}
void updata(int a,int add)
{
    while(a<num)
    {
        cnt[a]+=add;
        a+=lowbit(a);
    }
}
int sum(int a)
{
    int ans=0;
    while(a>0)
    {
        ans+=cnt[a];
        a-=lowbit(a);
    }
    return ans;
}
int main()
{
    int i,j,x,y,t;
    //freopen("in.txt","r",stdin);
    scanf("%d",&n);
    memset(cnt,0,sizeof(cnt));
    memset(level,0,sizeof(level));
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        updata(x+1,1);
        t=sum(x+1);
        level[t-1]++;
    }
    for(i=0;i<n;i++)
        printf("%d\n",level[i]);
    return 0;
}