POJ-2352 Stars(樹狀陣列)

ZMST發表於2019-02-23

題目連結:

首先進行題意理解:

給你星星的座標(y遞增,若y相等,x遞增)

每個星星都有一個等級

規定它的等級就是在它左下方的星星的個數

輸入所有星星後,依次輸出等級為0到n-1的星星的個數。

所以

就是統計x前面比它小的星星的個數

符合樹狀陣列最基本的應用(輸出左邊小於x的數的個數)

注意的是:樹狀陣列下標為0的位置不可用,所以我們需要在輸入x座標時+1.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define  maxn 32010
#define lowbit(i) ((i)&(-i))
int c[maxn];
int ans[maxn];
/*int getSum(int x)
{
    int sum=0;
    while (x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
void update(int x,int v)
{
    while(x<maxn)
    {
        c[x]+=v;
        x+=lowbit(x);
    }
}*/
int getSum(int x)
{
    int sum=0;
    for(int i=x;i>0;i-=lowbit(i))
    {
        sum+=c[i];
    }
    return sum;
}
void update(int x,int v)
{
    for(int i=x;i<=maxn;i+=lowbit(i))
    {
        c[i]+=v;
    }
}
int main()
{
    int n;
    while (~scanf("%d",&n))
    {
        memset(c,0, sizeof(c));
        memset(ans, 0, sizeof(ans));
        int x,y;
        for(int i=0;i<n;i++)
        //while(n--)
        {
            scanf("%d%d",&x,&y);
            x++;
            ans[getSum(x)]++;
            update(x, 1);
        }
        for(int i=0;i<n;i++)
        {
            printf("%d\n",ans[i]);
        }
    }
    return 0;
}

 

相關文章