POJ 2352 Stars

二維偏序問題,用樹狀數組解決。數組

本題看似二維,但給出的數據就是已經按照y從小到大排好序的,也就是說,當前讀到一個點的時候,當前點的y座標確定比已經讀入的大,或者等於。就算是等於的話,也是x座標比我當前點的x座標小。這樣一來,咱們若是按照讀入順序來處理,則保證了後面點的y座標必定大於前面的點,因此咱們每次只需統計x座標比咱們當前點小的個數就好了。ide

注意:給的點的座標是從0開始的,樹狀數組下標從1開始(0的位置不可用),因此須要在輸入x座標時+1處理。blog

const int N=15010,M=32010;
PII a[N];
int c[M];
int cnt[N];
int n;

int lowbit(int x)
{
    return x&-x;
}

void add(int x,int v)
{
    for(int i=x;i<M;i+=lowbit(i))
        c[i]+=v;
}

int sum(int x)
{
    int res=0;
    for(int i=x;i;i-=lowbit(i))
        res+=c[i];
    return res;
}

int main()
{
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        cin>>a[i].fi>>a[i].se;
        a[i].fi++;
        cnt[sum(a[i].fi)]++;
        add(a[i].fi,1);
    }
    
    for(int i=0;i<n;i++) cout<<cnt[i]<<endl;

    //system("pause");
    return 0;
}
相關文章
相關標籤/搜索