💭

ABC381D

に公開

問題

ABC381D

解法

連続した部分列で aabbcc\cdots の形をしている必要がある.
また,同じ数字は 2個(=1組) しか使われないので,使ったか記録しながら尺取り法で解ける.

尺取り法の while 文は,条件判定の部分を関数化し,その関数で判定と共に右端 r の更新を行った.
複雑な部分をなるべく関数化して,本文を簡略化する.

コード

main.cpp
int main() {
  ll n;
  cin >> n;
  vll a(n); rep(i,n) { cin >> a[i]; a[i]--; }

  vector<bool> used(n); 
  auto ok = [&](ll& r, ll& cnt) -> bool {
    if(r+1 >= n) return false;

    if(a[r] == a[r+1] && !used[a[r]]){
      used[a[r]] = true;
      cnt++;
      r += 2;
      return true;
    }else return false;
  };
  

  ll ans = 0;
  rep(s,2){
    ll r = 0;
    ll cnt = 0;
    for(ll l = s; l < n; l += 2){
      // update r
      chmax(r,l);
      while(ok(r,cnt)){}
      chmax(ans, cnt*2);

      // update l 
      if(a[l] == a[l+1]){
        used[a[l]] = false;
        cnt--;
      }
    }

  }

  cout << ans << endl;

  return 0;
}

Discussion