离散话和区间修改:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN= 100010;
int t[MAXN][2],s[MAXN<<3];
struct tree{
int l,r;
int color;
}a[MAXN<<3];
int ans=0;
int vis[MAXN<<3];
void Build(int l,int r,int k){
a[k].l=l,a[k].r=r,a[k].color=0;
if(l == r){
return ;
}
else{
int mid=(a[k].l+a[k].r)>>1;
Build(l,mid,k<<1);
Build(mid+1,r,k<<1|1);
}
}
void pushdown(int k){
if(a[k].color){
a[k<<1].color=a[k].color;
a[k<<1|1].color=a[k].color;
a[k].color=0;
}
}
void insertp(int l,int r,int col,int k){
if(s[a[k].l]==l && s[a[k].r]==r){
a[k].color=col;
return ;
}
else{
pushdown(k);
int mid=(a[k].l+a[k].r)>>1;
if(r<=s[mid]){
insertp(l,r,col,k<<1);
}
else if(l>s[mid]){
insertp(l,r,col,k<<1|1);
}
else{
insertp(l,s[mid],col,k<<1);
insertp(s[mid+1],r,col,k<<1|1);
}
}
}
void query(int k){
if(a[k].color){
if(!vis[a[k].color]){
vis[a[k].color]=1;
ans++;
}
return ;
}
query(k<<1);
query(k<<1|1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int counter=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&t[i][0],&t[i][1]);
s[counter++]=t[i][0];
s[counter++]=t[i][1];
}
sort(s,s+counter);
counter=unique(s,s+counter)-s;
Build(0,counter-1,1);
for(int i=1;i<=n;i++){
insertp(t[i][0],t[i][1],i,1);
}
memset(vis,0,sizeof(vis));
ans=0;
query(1);
printf("%d\n",ans);
}
return 0;
}