poj2352树状数组解决偏序问题

树状数组解决这种偏序问题是很厉害的!

/*
输入按照y递增,对于第i颗星星,它的level就是之前出现过的星星中,横坐标小于i的总数
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 32200
int bit[maxn],n;
void add(int i){
    while(i<=maxn){
        bit[i]+=1;
        i+=i&-i;
    }
}
int sum(int i){
    int s=0;
    while(i>0){
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
int main(){
    int x,y;
    int ans[maxn];
    while(scanf("%d",&n)==1){
        memset(ans,0,sizeof ans);
        memset(bit,0,sizeof bit);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            ++x;//x不可为0 
            ans[sum(x)]++;
            add(x); 
        }
        for(int i=0;i<n;i++) 
            printf("%d
",ans[i]);
    }
}
原文地址:https://www.cnblogs.com/zsben991126/p/10074234.html