#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
int li[200100],ri[200100];
int x[1000010];
struct data{
int l,r,col;
}tr[200100];
int n,m;
int ans;
bool flag[200100];
/*int ef(int l,int r,int number ){
int mid;
while(l<=r){
mid=(l+r)>>1;
if(x[mid]==number){
return mid;
}
else if(x[mid]>number){
r=mid-1;
}
else l=mid+1;
}
return 0;
}*/
void build(int k,int l,int r){
tr[k].l=l;
tr[k].r=r;
tr[k].col=0;
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
return ;
}
void down(int k)
{
if(!tr[k].col){
return ;
}
tr[k<<1].col=tr[k].col;
tr[k<<1|1].col=tr[k].col;
tr[k].col=0;
}
void cover(int k,int l,int r,int x)
{
if(l>tr[k].r||r<tr[k].l) return ;
if(l<=tr[k].l&&r>=tr[k].r)//cout<<"haha"<<endl;
{
tr[k].col=x;
return ;
}
down(k);
cover(k<<1,l,r,x);
cover(k<<1|1,l,r,x);
return ;
}
void ask(int k,int l,int r)
{
if(l==r){
if (!flag[tr[k].col]){
ans++;
flag[tr[k].col]=1;
}
return ;
}
down(k);
int mid=(l+r)>>1;
ask(k<<1,l,mid);
ask(k<<1|1,mid+1,r);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int nn=0;
scanf("%d",&n);
memset(x,0,sizeof(x));
memset(flag,0,sizeof(flag));
memset(tr,0,sizeof(tr));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&li[i],&ri[i]);
x[++nn]=li[i];
x[++nn]=ri[i];
}
sort(x+1,x+nn+1);
m=unique(x+1,x+nn+1)-(x+1);
flag[0]=1;
build(1,1,m);
for(int i=1;i<=n;i++){
int l=lower_bound(x+1,x+m+1,li[i])-x;
int r=lower_bound(x+1,x+m+1,ri[i])-x;
cover(1,l,r,i);
}
ans=0;
ask(1,1,m);
printf("%d\n",ans);
}
return 0;
}
/*
3
3
5 6
4 5
6 8
3
1 10
1 3
6 10
5
1 4
2 6
8 10
3 4
7 10
*/
poj 2528 线段树离散化
最新推荐文章于 2020-03-09 20:25:51 发布