POJ2352【树状数组】

个人NO。1

一开始题意理解有错。

一星星左下边有N颗星星,那它的等级就是N。

一开始理解必须X,Y两个坐标都小于,后来根据样例看了一下只要左下方即可,X,Y坐标都小于等于即可,但不包括星星本身。

#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;

int lowbit(int x)

{

    return x&-x;

}

int c[32005];

int x[32005];

int n;

int ans[32005];

int visit[32005];

int a[32005];

void add(int x,int y)//后面的所有的值得更新,不包括自身

{

    while(x<=32005)

    {

       c[x]+=y;

       x+=lowbit(x);

    }

}

int sum(int x)

{

    int ret=0;

    while(x>0)

    {

        ret+=c[x];

        x-=lowbit(x);

    }

    return ret;

}

int main()

{

    while(scanf("%d",&n)!=EOF)

    {

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

        memset(x,0,sizeof(x));

        memset(ans,0,sizeof(ans));

        int x,y;

        for(int i=1;i<=n;i++)

        {

            scanf("%d%d",&a[i],&y);

            if(visit[a[i]+1]==0)

            {

                add(a[i]+2,1);

                visit[a[i]+1]=1;

            }

            else 

            add(a[i]+1,1);//c[i]表示比i坐标小的个数

            ans[sum(a[i]+1)]++;

        }



       for(int i=0;i<n;i++)

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

    }

    return 0;

}


题目有陷阱就是坐标可以输入0,这对lowbit不适应。

 

对树状数组的用法更了解了一下,大致用法如下:balabala....奋斗奋斗

 

 

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