POJ 2352 Stars(树状数组)

题解:仔细想下,这题的y没有用,有用的只是x,x出现一次就加一次(这里是x+1,因为x可能等于0),之后再把0到x的全部值加一遍,得出的tem用ans数组记录下来,最后输出即可。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int MAX_N=15005;
const int MAX_B=15005<<2;//范围尽量开大  4倍 也就是和线段树一样

int bit[MAX_B],n;
int ans[MAX_N];

int sum(int i)//相加是减到最根节点
{
    int s=0;
    while(i>0)
    {
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
void add(int i,int x)//修改是不断向父节点延伸
{
    while(i<=MAX_B)/**< 最重要的就是这!! 这是i<=MAXB  而不是n!! */
    {
        bit[i]+=x;
        i+=i&-i;
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)///输入全用scan = =用cin的我超了好几次时
    {
        memset(ans,0,sizeof(ans));
        memset(bit,0,sizeof(bit));
        int x,y;
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            int tem=sum(x+1);
            ans[tem]++;
            add(x+1,1);
        }
        for (int i=0;i<n;i++)
        {
            printf("%d
",ans[i]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/s1124yy/p/5520992.html