RT。
ABC381T5
做法:二分
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n,q,pre[MAXN],suf[MAXN],kc,nowdet,nl,nr,ans,num1,num2,num3[MAXN],len,now;
char s[MAXN];
struct l{
int l,r;
}p[MAXN];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q>>s;
for(int i=1;i<=n;i++){
if(s[i-1]=='1'){
pre[i]=pre[i-1]+1;
}
else{
pre[i]=pre[i-1];
}
if(s[i-1]=='/'){
num3[++len]=i;
}
}
for(int i=n;i>=1;i--){
if(s[i-1]=='2'){
suf[i]=suf[i+1]+1;
}
else{
suf[i]=suf[i+1];
}
}
for(int i=1;i<=q;i++){
cin>>p[i].l>>p[i].r;
}
for(int i=1;i<=q;i++){
ans=0;
int l=0,r=len,sx=0;
while(l<=r){
int mid=(l+r)/2;
if(pre[num3[mid]]-pre[p[i].l-1]>=suf[num3[mid]]-suf[p[i].r+1]){
l=mid+1;
}
else{
r=mid-1;
}
sx=mid;
}
ans=max(max(1+min(pre[num3[sx]]-pre[p[i].l-1],suf[num3[sx]]-suf[p[i].r+1])*2,1+min(pre[num3[sx+1]]-pre[p[i].l-1],suf[num3[sx+1]]-suf[p[i].r+1])*2),1+min(pre[num3[sx-1]]-pre[p[i].l-1],suf[num3[sx-1]]-suf[p[i].r+1])*2);
if((p[i].l>num3[sx]||p[i].r<num3[sx])&&(p[i].l>num3[sx+1]||p[i].r<num3[sx+1])&&(p[i].l>num3[sx-1]||p[i].r<num3[sx-1])){
ans=0;
}
cout<<ans<<endl;
}
return 0;
}