💭
ABC381D
問題
解法
連続した部分列で
また,同じ数字は 2個(=1組) しか使われないので,使ったか記録しながら尺取り法で解ける.
尺取り法の while 文は,条件判定の部分を関数化し,その関数で判定と共に右端
複雑な部分をなるべく関数化して,本文を簡略化する.
コード
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