poj 2352

线段树题

注意思想。

代码:

#include<iostream>
#include<fstream>

using namespace std;

struct e{
	int l,r;
	int cn;
}tree[70000];
int level[15001];
int n;
int x[15001],y[15001];
int maxx;

void build(int l,int r,int p){
	tree[p].l=l;
	tree[p].r=r;
	tree[p].cn=0;
	if(l<r)
	{
		int mid=(l+r)>>1;
		build(l,mid,p*2);
		build(mid+1,r,p*2+1);
	}
}

void insert(int l,int p){
	if(l==tree[p].l&&l==tree[p].r)
	{
		tree[p].cn++;
		return;
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	if(l<=mid)
		insert(l,p*2);
	else
		insert(l,p*2+1);
	tree[p].cn++;
}

int find(int l,int r,int p){
	if(l==tree[p].l&&r==tree[p].r)
	{
		return tree[p].cn;
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	if(r<=mid)
		return find(l,r,2*p);
	if(l>mid) return find(l,r,2*p+1);
	else
		return find(l,mid,2*p)+find(mid+1,r,2*p+1);
}


void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i];
		maxx=max(maxx,x[i]);
	}
	build(0,maxx,1);
	for(i=1;i<=n;i++)
	{
		level[find(0,x[i],1)]++;
		insert(x[i],1);
	}
	for(i=0;i<n;i++)
		cout<<level[i]<<endl;
}

int main(){
	read();
	return 0;
}

posted on 2011-03-05 10:37  宇宙吾心  阅读(670)  评论(0)    收藏  举报

导航