#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 1000001000
const int maxn = 51010;
int cover[maxn<<2];
void build(int l,int r,int rt){
cover[rt]=0;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void pushdown(int rt){
if(cover[rt]){
cover[rt<<1]=cover[rt<<1|1]=cover[rt];
cover[rt]=0;
}
}
int ql,qr,val;
void update(int l,int r,int rt){
if(ql<=l&&r<=qr){
cover[rt]=val;
return ;
}
pushdown(rt);
int m=(l+r)>>1;
if(ql<=m) update(lson);
if(qr> m) update(rson);
}
int vis[maxn+1];
int ans;
void query(int l,int r,int rt){
if(cover[rt]){
if(!vis[cover[rt]]) {ans++;
vis[cover[rt] ]=1;
}
return ;
}
if(l==r) return ;
int m=(l+r)>>1;
if(ql<=m) query(lson);
if(qr> m) query(rson);
}
struct Seg{
int x,y;
Seg(int xx=0,int yy=0):x(xx),y(yy){}
}seg[10001];
int a[maxn],kk=0,m;
int b[maxn];
int find(int value){
int p=lower_bound(a,a+m,value) - a;
return b[p];
}
int lim=50001;
int main()
{
int T,Q;
scanf("%d",&T);
while(T--){
scanf("%d",&Q);
//int x,y;
kk=0;
for(int i=1;i<=Q;i++){
scanf("%d %d",&seg[i].x,&seg[i].y);
a[kk++]=seg[i].x;
a[kk++]=seg[i].y;
}
sort(a,a+kk);
m=unique(a,a+kk) - a;
int tt=1;
for(int i=0;i<m;i++){
b[i]=tt++;
if(i&&a[i]>a[i-1]+1) b[i]=tt++;
}
build(1,lim,1);
int temp=1;
for(int i=1;i<=Q;i++){
ql=find(seg[i].x);
qr=find(seg[i].y);
val=temp++;
update(1,lim,1);
}
ans=0;
memset(vis,0,sizeof(vis));
ql=1; qr=lim;
query(1,lim,1);
printf("%d\n",ans);
}
return 0;
}
POJ - 2528 线段树
最新推荐文章于 2019-09-13 13:03:03 发布