题目链接:
http://poj.org/problem?id=2352
题意:
给你一系列点(按y递增,x递增排列),level[X] 指的是 在当前点的左下方 包括自己 的点数为X 的这些点的个数。
题解:
树状数组
y递增,不管y,只要维护x就行了
读入一个点,找到比他小的点的个数,也就是他的等级,然后将这个等级的点的个数加一即可
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 32000+10;
int bit[maxn],level[maxn];
void add(int x,int v){
while(x < maxn){
bit[x] += v;
x += x&-x;
}
}
int sum(int x){
int res = 0;
while(x > 0){
res += bit[x];
x -= x&-x;
}
return res;
}
int main(){
int n=read();
MS(level); int x,y;
for(int i=0; i<n; i++){
x=read(),y=read(); x++;
add(x,1);
level[sum(x)]++;
}
for(int i=1; i<=n; i++)
cout << level[i] << endl;
return 0;
}