Codeforces 180E Cubes
問題
n個の数列がある。
この中からk個以下の数字を削除して、連続する同一の数字の長さを最大にしたい。
その最大値を求めよ。
制約条件
n≦2 * 10^5
方針
数字ごとに、その数字が出てくるインデックスを取り出す。
そしたら、その数字ごとに尺取すればいい。
すなわち、消す数がk個以下である間範囲を伸ばし続けるような尺取。
これで時間・空間計算量がO(n)で答えが求まる。
ソースコード
int n, m, k, a[200000], ans; vi v[100010]; int main(){ cin >> n >> m >> k; rep(i, n){ cin >> a[i]; v[a[i]].pb(i); } rep(it, 100010){ vi &b = v[it]; int i = 0, j = 0, skip = 0; for(; i < b.size(); i++){ while(j < b.size()){ if(i != j && skip + b[j] - b[j-1] - 1 > k) break; if(i < j) skip += b[j] - b[j-1] - 1; j++; } ans = max(ans, j - i); if(i + 1 < j) skip -= b[i+1] - b[i] - 1; } } cout << ans << endl; return 0; }