Description
天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的。
给定星星的位置,输出各级星星的数目。
Input
第一行,一个整数N,表示星星的数目。接下来N行,每行两个整数x,y,表示一个星星的坐标,输入数据保证不会有星星重叠。
Output
N行,每行一个整数,分别表示0,1,2,3...N-1级星星的数目。
Hint
1<=N<=15000 0<=x,y<=32000。
Solution
这道题最开先真的难住我了(有什么难不住你的靠。),然后其实这个y还没什么用(。在加入的过程中就依次统计sum和修改后面的sum。用一个数组记录就行了。(真的很难啊靠。)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 500005
#define lowbit(x) (x&-x)
#define int long long
using namespace std;
int c[maxn],cntx[maxn],cnty[maxn],gradee[maxn];
int n,x,y,maxy;
void doadd(int x,int d){
while(x<=maxn){
c[x]+=d;
x+=lowbit(x);
}
}
int dofinD(int x){
int ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x,&y);
int t=dofinD(x);
gradee[t]++;
doadd(x,1);
}
for(int i=0;i<n;i++){
printf("%lld
",gradee[i]);
}
return 0;
}