数星星 contest 树状数组练习 T2

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\n",gradee[i]);
	}
	return 0;
}
posted @ 2018-11-30 17:22  虚拟北方virtual_north。  阅读(136)  评论(0编辑  收藏  举报