https://codeforces.com/problemset/problem/1849/C


解析:
对于某个区间x,y,他排序之后,最左侧的连续0和最右侧的连续1是不影响排序结果的。
假设左侧连续a个0,右侧b个1,那么对于 [x,y]排序,和对于[x+a,y-b]排序是一样的。
所以我们记录每个位置最近的右侧1的坐标和最左侧的0的坐标,每次将范围映射到更小的唯一区间里里面即可。
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,m,a[N],l[N],r[N],k;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
k=0;
for(int i=1;i<=n;i++){
scanf("%1d",&a[i]);
if(a[i]==0) k=i;
l[i]=k;
}
k=n+1;
for(int i=n;i>=1;i--){
if(a[i]==1) k=i;
r[i]=k;
}
set<pair<int,int>>res;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
x=r[x];
y=l[y];
if(x>y) x=1,y=1;
res.insert({x,y});
}
printf("%d\n",res.size());
}
return 0;
}