HDU 1541 Stars (树状数组)

题意:直角坐标系上有n个点 每个点的值为它左下的点的数量

        求0。。。n-1每个数值出现的次数

思路:题目中已经给出y递增 x在y相同时递增

        从而可以一边输入一边利用树状数组将结果求出

        每次输入时 先计算出 sum(x+1)   (由于树状数组下标从1 开始 ,所以每个值都加1,否则会超时)

        再 add(x)

        最后统计结果

 

 

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;

int c[50000],num[50000];

int N=32100;

int lowbit(int x)

{

    return x&(-x);

}

int sum(int x)

{

    int ret=0;

    while(x>0)

    {

        ret+=c[x];

        x-=lowbit(x);

    }

    return ret;

}

void add(int x,int d)

{

    while(x<=N)

    {

        c[x]+=d;

        x+=lowbit(x);

    }

}

int main()

{

    int t;

    int i,j;

    while(cin>>t)

    {

        memset(c,0,sizeof(c));

        memset(num,0,sizeof(num));

        for(i=0;i<t;i++)

        {

            int x,y;

            scanf("%d%d",&x,&y);

            num[sum(x+1)]++;

            add(x+1,1);

        }

        for(i=0;i<t;i++)

        {

            printf("%d\n",num[i]);

        }

    }

    return 0;

}

  

你可能感兴趣的:(树状数组)