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;
}
浙公网安备 33010602011771号