题目让你求星星等级,对于每个星星都会有 x,y,坐标,对于某一个星星的等级就是 所有x坐标以及y坐标都小于等于它的坐标的 星星总数,题目给n个星星,然后输出星星等级为等级0到n-1的 的数量
因为星星的y坐标输入情况是不会出现大小下降的情况,然后所有点的坐标是不会重复的,所以直接只对x坐标进行处理就可以了,那么就是利用树状数组 对于 x坐标加进去的 求和,即为 小于它的数目,再加上1也就是等级,由于坐标有可能为0,0树状数组处理的时候坐标要加1
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype>
#define ll long long
#define LL __int64
#define eps 1e-8
//const ll INF=9999999999999;
#define inf 0xfffffff
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p;
const int N = 500000 + 10;
int n;
int c[N],x[N];
int ans[N];;
int lowbit(int x) {
return x&(-x);
}
void update(int i,int val) {
while(i <= 32005) {
c[i] += val;
i += lowbit(i);
}
}
int get_sum(int i) {
int sum = 0;
while(i > 0) {
sum += c[i];
i -= lowbit(i);
}
return sum;
}
int main() {
while(scanf("%d",&n) == 1) {
for(int i=1;i<=n;i++) {
int y;
scanf("%d %d",&x[i],&y);
x[i]++;
}
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++) {
ans[get_sum(x[i])]++;
update(x[i],1);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}
/*
5
1 1
5 1
7 1
3 3
5 5
*/