`
lovnet
  • 浏览: 6670314 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

POJ 2352 Stars 线段树 单点更新 成段求和

 
阅读更多
//POJ 2352 Stars 线段树 单点更新 成段求和
/*
题意:给一系列点(按y递增,y相同时按x递增排列),level指不超过当前点的高度且不在当前点右边的点的个数
	  求level值分别为0,1,2,..n-1的个数

思路:由于题意已经是按顺序给的点,所以直接按x轴建树
	  注意x从0开始,线段树从1开始,所以x全部+1处理

*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define N 32005
#define M 15005
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r


int sum[N<<2],ans[M];
int n;

void Pushup(int rt){
	sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}

void Update(int rt,int l,int r,int x){
	if(l == r){
		sum[rt]++;
		return ;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) Update(lson,x);
	if(x > mid ) Update(rson,x);
	Pushup(rt);
}

int Query(int rt,int l,int r,int L,int R){
	if(L <= l && R >= r)
		return sum[rt];
	int mid = (l + r) >> 1;
	int res = 0;
	if(L <= mid) res += Query(lson,L,R);
	if(R > mid ) res += Query(rson,L,R);
	return res;
}


int main(){
	int i;
	int x,y;
	while(scanf("%d",&n)!=EOF){
		memset(sum,0,sizeof(sum));
		memset(ans,0,sizeof(ans));
		for(i = 1; i <= n; ++i){
			scanf("%d %d",&x,&y);
			++x;
			++ans[Query(1,1,32001,1,x)];
			Update(1,1,32001,x);
		}
		for(i = 0; i < n; ++i)
			printf("%d\n",ans[i]);
	}
	return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics