传送门:http://poj.org/problem?id=2352
题目大意: 有n个星星, 现在分别给出它们的坐标(按y递增的顺序给出),每个星星有一个等级(该星星的等级是x坐标和y坐标都不大于该星的星星数),先要求出每个等级的星星有多少个
题解:
1.由于 y坐标是按照升序给出的,我们可以仅考虑x坐标,进行树状数组求和,这也提醒蒟蒻以后遇见二维坐标问题可以把其中一个坐标排序来做
2.一定要注意x的坐标可能为0,所以得加一,不然在update操作中会死循环的,我会告诉你我在poj TLE10+次吗??
/*
ID:iamzky
OJ:POJ
Index:2352
Language:C++
*/
#include<cstdio>
using namespace std;
int n;
int d[32010];
int ranks[15001];
int lowbit(int x){
return x&(-x);
}
int get(int x){
int s=0;
while(x){
s+=d[x];
x-=lowbit(x);
}
return s;
}
void updata(int x){
while(x<=32010){
d[x]++;
x+=lowbit(x);
}
}
int main(){
int i,x,y;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d",&x,&y);
ranks[get(x+1)]++;
updata(x+1);
}
for(i=0;i<n;i++)
printf("%d\n",ranks[i]);
return 0;
}