Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 26695 | Accepted: 7711 |
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
Source
//这种离散化我还是第一次遇见,就是把所有的坐标排列,然后就把排列后的相邻两个坐标当成一段线段
//然后进行排序、把名次下标当作线段树的范围
//这样做多久2W组了,标记的话比较简单、判重的话果断hash,呵呵
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define lson l,m,k<<1
#define rson m+1,r,k<<1|1
#define N 10001
using namespace std;
int n;
int re[N][2];
int rc[N<<1];
int st[N<<2];
bool hash[N<<1];
int flag;
int bf(int &x)
{
int l=0,r=n,m;
while(l<=r)
{
m=(l+r)>>1;
if(rc[m]>x) r=m-1;
else if(rc[m]<x) l=m+1;
else return m;
}
}
void down(int &k)
{
st[k<<1]=st[k<<1|1]=st[k];
st[k]=-1;
}
void build(int l,int r,int k)
{
st[k]=-1;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void updata(int &L,int &R,int l,int r,int k)
{
if(L<=l&&R>=r)
{
st[k]=flag;
return ;
}
if(st[k]!=-1)
down(k);
int m=(l+r)>>1;
if(L<=m) updata(L,R,lson);
if(R>m) updata(L,R,rson);
}
void query(int l,int r,int k)
{
if(st[k]!=-1)
{
hash[st[k]]=1;
return ;
}
int m=(l+r)>>1;
query(lson);
query(rson);
}
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
int m,j,i;
scanf("%d",&m);
for(j=0,i=0;i<m;i++)
{
scanf("%d%d",&re[i][0],&re[i][1]);
rc[j++]=re[i][0];rc[j++]=re[i][1];
}
sort(rc,rc+j);
for(i=1,n=0;i<j;i++)
if(rc[i]!=rc[i-1])
rc[++n]=rc[i];
build(0,n,1);
int left,right;
for(i=0;i<m;i++)
{
left=bf(re[i][0]);
right=bf(re[i][1]);
flag=i;
updata(left,right,0,n,1);
}
for(i=0;i<=n;i++)
hash[i]=0;
query(0,n,1);
for(j=i=0;i<=n;i++)
if(hash[i])
j++;
printf("%d\n",j);
}
return 0;
}