結果
| 問題 |
No.3063 Circle Balancing
|
| コンテスト | |
| ユーザー |
tute7627
|
| 提出日時 | 2024-07-06 23:49:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,150 bytes |
| コンパイル時間 | 2,721 ms |
| コンパイル使用メモリ | 203,108 KB |
| 最終ジャッジ日時 | 2025-03-13 01:13:29 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 7 WA * 20 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/segtree>
using namespace std;
struct M{
int v0, v2, v20;
};
M op(M a, M b){
M res;
res.v0 = a.v0 + b.v0;
res.v2 = a.v2 + b.v2;
res.v20 = max({a.v2 + b.v20, a.v2 + b.v0});
return res;
}
M e(){
return {0, 0, 0};
}
int main(){
int N;cin >> N;
assert(1 <= N && N <= 300000);
vector<int> A(N);
vector<vector<int>> Ai(N);
for(int i = 0; i < N; i++){
cin >> A[i];
assert(1 <= A[i] && A[i] <= N);
Ai[A[i]-1].push_back(i);
}
atcoder::segtree<M, op, e> seg(vector<M>(2*N, {0, 1, 1}));
int ans = INT_MAX;
for(int i = 0; i < N; i++){
if(Ai[i].size() == 0) continue;
int res = (N - Ai[i].size()) * 2;
cerr << i << " " << res << endl;
for(int j = 0; j < Ai[i].size(); j++){
int l = Ai[i][j], r = Ai[i][(j+1)%Ai[i].size()];
if(l >= r)r += N;
res -= seg.prod(l + 1, r).v20;
}
for(auto idx: Ai[i]){
seg.set(idx, {1, 0, 1});
seg.set(idx + N, {1, 0, 1});
}
ans = min(ans, res);
}
cout << ans << endl;
}
tute7627