poj 2528_2

代码:

#include<iostream>
#include<fstream>

using namespace std;

struct e{
	int l,r;
	bool isa;
};

e tree[80001];
int n;

struct f{
	int num,s,l;
};

f b[20001];

int c[10001][2];

int cmp(const void *a,const void *b){
	f *s=(f*)a;
	f *t=(f*)b;
	return s->l-t->l;
}

void build(int s,int t,int p){
	tree[p].l=s;
	tree[p].r=t;
	tree[p].isa=0;
	if(s==t) return;
	int k=(s+t)>>1;
	build(s,k,p*2);
	build(k+1,t,2*p+1);
}

int update(int s,int t,int p){
	int i,j,k;
	if(s<=tree[p].l&&tree[p].r<=t)
	{
		if(tree[p].isa==1) return 0;
		else
		{
			tree[p].isa=1;
			return 1;
		}
	}
	if(tree[p].isa) return 0;

	if(t<=tree[2*p].r){
		
		i= update(s,t,p*2);
		if(tree[2*p].isa&&tree[2*p+1].isa)
			tree[p].isa=1;
		return i;
	}
	else
		if(s>=tree[2*p+1].l)
		{	i= update(s,t,p*2+1);
			if(tree[2*p].isa&&tree[2*p+1].isa)
				tree[p].isa=1;
			return i;	
		}
		else
		{
			i=update(s,t,p*2);
			
			j=update(s,t,p*2+1);
			if(tree[2*p].isa&&tree[2*p+1].isa)
				tree[p].isa=1;
			if(i||j) return 1;
			return 0;
		}

}



void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	int cas;
	cin>>cas;
	while(cas--)
	{
		cin>>n;
		for(i=0;i<n;i++)
		{
			cin>>b[2*i].l>>b[2*i+1].l;
			b[2*i].num=i+1;
			b[2*i].s=0;
			b[2*i+1].num=i+1;
			b[2*i+1].s=1;
		}
		qsort(b,2*n,sizeof(f),cmp);
		j=1;
		c[b[0].num][b[0].s]=1;
		for(i=1;i<2*n;i++)
		{
			if(b[i].l!=b[i-1].l) j++;
			c[b[i].num][b[i].s]=j;
		}
		build(1,j,1);
		int ans=0;
		for(i=n;i>=1;i--)
		{
			if(c[i][0]>c[i][1]) swap(c[i][0],c[i][1]);
			ans+=update(c[i][0],c[i][1],1);
			
		}
		cout<<ans<<endl;
	}
}

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

posted on 2011-05-16 12:07  宇宙吾心  阅读(248)  评论(0)    收藏  举报

导航