ABC E 求调
  • 板块学术版
  • 楼主Night_sea_64
  • 当前回复15
  • 已保存回复16
  • 发布时间2024/11/22 21:43
  • 上次更新2024/11/23 08:26:52
查看原帖
ABC E 求调
554145
Night_sea_64楼主2024/11/22 21:43

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;
}
2024/11/22 21:43
加载中...