POJ 2352 Stars(树状数组)

思路:

(刚开始想歪了,想着先离散然后用二维BIT来做,结果内存根本hold不住QAQ)
这道题既然是按y升序给我们的序列,我们在遍历到这个序列时,查一下有多少x小于我们当前的x就ok了,区间求和、单点修改自然用树状数组最方便了~

代码:

#include<iostream>
using namespace std;
const int maxn=15000+5;
const int maxc=32000+5;
int n,bit[maxc],res[maxn];
#define lowbit(i) (i&-i)
void add(int i){
	while(i<maxc) bit[i]++,i+=lowbit(i);
}
int sum(int i){
	int s=0;
	while(i>0) s+=bit[i],i-=lowbit(i);
	return s;
}
void solve(){
	int x,y;
	for(int i=0;i<n;i++){
		scanf("%d%d",&x,&y);
		res[sum(++x)]++;
		add(x);
	}
	for(int i=0;i<n;i++) printf("%d\n",res[i]);
}
int main(){
//	freopen("Arutoria.txt","r",stdin);
	scanf("%d",&n);
	solve();
	return 0;
}
posted @ 2019-12-04 18:08  YuhanのBlog  阅读(106)  评论(0编辑  收藏  举报