poj 2528

线段树,先离散化,再线段树。

#include<iostream>
#include<fstream>

using namespace std;
int x[10001],y[10001];
int h[20001];
int a[10000001];
int v[10001];

int cmp(const void *a,const void *b){
	return *((int*)a)-*((int *)b);
}

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

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

void find(int l,int r,int p){
	if(tree[p].color>0)
	{
		v[tree[p].color]=1;
		return;
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	find(l,mid,2*p);
	find(mid+1,r,2*p+1);
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	int K;
//	cin>>K;
	scanf("%d",&K);
	while(K--)
	{
//		cin>>n;
		scanf("%d",&n);
		memset(a,0,sizeof(a));
		k=0;
		for(i=1;i<=n;i++)
		{
//			cin>>x[i]>>y[i];
			scanf("%d%d",&x[i],&y[i]);
			if(!a[x[i]])
			{
				h[++k]=x[i];
				a[x[i]]=1;
			}
			if(!a[y[i]])
			{
				h[++k]=y[i];
				a[y[i]]=1;
			}
		}
		qsort(h+1,k,sizeof(int),cmp);
		for(i=1;i<=k;i++)
			a[h[i]]=i;
		build(1,k,1);
		for(i=1;i<=n;i++)
		{
			insert(a[x[i]],a[y[i]],i,1);
		}
		memset(v,0,sizeof(v));
		find(1,k,1);
		j=0;
		for(i=1;i<=n;i++)
			if(v[i]) j++;
		cout<<j<<endl;
	}


}

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

posted on 2011-03-07 16:41  宇宙吾心  阅读(535)  评论(0)    收藏  举报

导航