競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 083D問題

ABC083D

解法

答え \(K\) について単調性があり,小さい \(K\) であれば成立する. Flip する区間を一つだけずらして再び flip すれば,両端だけ flip することが出来る. 基本はこれを繰り返せばよい.
しかし,真ん中はどうやっても flip できない. 左端に合わせて flip した場合と, 右端に合わせて flip した場合の重なった部分は, どうやっても flip できない. よって,この重なった部分は最初から全て同じ値である必要がある. 逆に,それを満たす \(K\) であれば常に可能.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  // O(n), 累積和
  string s; cin >> s;
  ll n = s.length();

  vll t(n+1);
  rep(i,n) t[i+1] = s[i]=='1';
  rep(i,n) t[i+1] += t[i];

  ll ans = 0;
  rep1(x,n){
    ll d = x - ceil(n,2LL);
    ll r = n/2 + d + (n%2);
    ll l = n/2 - d;
   
    if(l > r || t[r]-t[l]==0 || t[r]-t[l]==r-l){
      chmax(ans, x);
    }
  }
  cout << ans << endl;

  return 0;
}