【题目】http://poj.org/problem?id=2528
【题意】
【思路】
【代码】
#include<algorithm>
#include<cstdio>
using namespace std;
const int M=100005;
int flag;
class Post
{
public:
int x,id;
};Post post[M<<2];
class Tree
{
public:
int l,r,vis;
};Tree tree[M<<2];
bool cmp1(Post a,Post b)
{
return a.x<b.x;
}
bool cmp2(Post a,Post b)
{
if(a.id==b.id)return a.x<b.x;
else return a.id>b.id;///第二次排序从后往前贴
}
void build(int l,int r,int cnt)
{
tree[cnt].l=l;tree[cnt].r=r;tree[cnt].vis=0;
if(l==r)return;
int mid=(l+r)/2;
build(l,mid,cnt*2);build(mid+1,r,cnt*2+1);
}
void query(int L,int R,int cnt)
{
if(tree[cnt].vis)return;
if(L==tree[cnt].l&&R==tree[cnt].r)
{
flag=1;
tree[cnt].vis=1;
return;
}
int mid=(tree[cnt].l+tree[cnt].r)/2;
if(L>mid)query(L,R,cnt*2+1);
else if(R<=mid)query(L,R,cnt*2);
else
{
query(L,mid,cnt*2);
query(mid+1,R,cnt*2+1);
}
tree[cnt].vis=tree[cnt*2].vis&&tree[cnt*2+1].vis;
}
int main()
{
int c;scanf("%d",&c);
while(c--)
{
int n;scanf("%d",&n);
for(int i=0;i< n*2 ;i+=2)
{
scanf("%d%d",&post[i].x,&post[i+1].x);
post[i].id=post[i+1].id=i;
}
sort(post,post + n*2,cmp1);
int tot=0;int bef=0;
for(int i=0;i< n*2;i++)
{
if(post[i].x==bef)
post[i].x=tot;
else
{
bef=post[i].x;
post[i].x=++tot;
}
}
build(1,n*2,1);
sort(post,post+n*2,cmp2);
int ans=0;
for(int i=0;i<2*n;i+=2)
{
flag=0;
int l=post[i].x,r=post[i+1].x;
query(l,r,1);//
if(flag==1)ans++;
}
printf("%d\n",ans);
}
}