AC*24,WA*1
终于有一次过 F 但是被 E 薄纱了。
主要思路就是找一个 /,左边 1 的个数和右边 2 的个数差不多的更优,所以二分找这两个值比较接近的位置然后算答案。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,q;
string s;
vector<int>v;
int s1[100010],s2[100010];
int main()
{
cin>>n>>q>>s;
s=' '+s;
for(int i=1;i<=n;i++)
{
if(s[i]=='/')
{
v.push_back(i);
}
s1[i]=s1[i-1]+(s[i]=='1');
s2[i]=s2[i-1]+(s[i]=='2');
}
while(q--)
{
int l,r;
cin>>l>>r;
int pl=lower_bound(v.begin(),v.end(),l)-v.begin();
int pr=upper_bound(v.begin(),v.end(),r)-v.begin()-1;
if(pr<pl)
{
cout<<0<<endl;
}
else
{
int ll=pl,rr=pr,ans=0;
while(ll<=rr)
{
int mid=(ll+rr)/2;
int pos=v[mid];
if(s1[pos-1]-s1[l-1]<=s2[r]-s2[pos])ll=mid+1,ans=mid;
else rr=mid-1;
}
if(!ans)
{
int pos=v[pl];
cout<<min(s1[pos-1]-s1[l-1],s2[r]-s2[pos])*2+1<<endl;
}
else if(ans==pr)
{
int pos=v[ans];
cout<<min(s1[pos-1]-s1[l-1],s2[r]-s2[pos])*2+1<<endl;
}
else
{
int pos=v[ans];
int min1=min(s1[pos-1]-s1[l-1],s2[r]-s2[pos])*2+1;
pos=v[ans+1];
int min2=min(s1[pos-1]-s1[l-1],s2[r]-s2[pos])*2+1;
cout<<max(min1,min2)<<endl;
}
}
}
return 0;
}