题目
思路
线段树染色板子题
主要是要离散化!
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
int al[1000010],ar[1001000],a[4000010];
const int maxn=1e6+5;
bool vis[maxn>>2];
struct sut{
int l,r,color,add;
}tree[maxn<<2];
void build(int l1,int r1,int x){
tree[x].l=l1;
tree[x].r=r1;
tree[x].add=0;
tree[x].color=-1;
if(l1==r1) return;
int mid=(l1+r1)>>1;
build(l1,mid,x<<1);
build(mid+1,r1,x<<1|1);
}
void pushdown(int x){
if(tree[x].add){
tree[x<<1].color=tree[x<<1|1].color=tree[x].color;
tree[x<<1].add=tree[x<<1|1].add=1;
tree[x].add=0;
}
}
int res=0;
void update(int l1,int r1,int col,int x){
if(l1<=tree[x].l&&tree[x].r<=r1){
tree[x].add=1;
tree[x].color=col;
return;
}
pushdown(x);
int mid=(tree[x].l+tree[x].r)>>1;
if(l1<=mid) update(l1,r1,col,x<<1);
if(r1>mid) update(l1,r1,col,x<<1|1);
}
void query(int l1,int r1,int x){
if(tree[x].l==tree[x].r){
if(!vis[tree[x].color]&&tree[x].color!=-1){
vis[tree[x].color]=1;
res++;
}
return;
}
pushdown(x);
int mid=(tree[x].r+tree[x].l)>>1;
query(l1,mid,x<<1);
query(mid+1,r1,x<<1|1);
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int len=0;
res=0;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++){
cin>>al[i]>>ar[i];
a[++len]=al[i];
a[++len]=ar[i];
}
sort(a+1,a+1+len);
len=unique(a+1,a+1+len)-a-1;//合并一样的
for(int i=len;i>=2;i--){
if(a[i]!=a[i-1]+1){
a[++len]=(a[i-1]+1);//在每个点的后的点添加一个点 避免被覆盖
}
}
sort(a+1,a+1+len);
build(1,len,1);
for(int i=1;i<=n;i++){
int l=lower_bound(a+1,a+1+len,al[i])-a;
int r=lower_bound(a+1,a+1+len,ar[i])-a;
// cout<<l<<" "<<r<<endl;
update(l,r,i,1);
}
query(1,len,1);
cout<<res<<endl;
}
return 0;
}