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; }