結果
問題 |
No.3269 Leq-K Partition
|
ユーザー |
![]() |
提出日時 | 2025-08-03 15:05:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3,816 ms / 6,000 ms |
コード長 | 1,379 bytes |
コンパイル時間 | 1,156 ms |
コンパイル使用メモリ | 117,820 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-08-11 16:48:37 |
合計ジャッジ時間 | 46,968 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; int main() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; a[i]--; } vector<bool> vis(n); auto calc = [&] (int k) { int pre = 0; int res = 0; int distinct = k; for (int i = 0; i < n; i++) { if (not vis[a[i]]) { if (distinct == k) { res++; for (int j = pre; j < i; j++) vis[a[j]] = false; distinct = 1; pre = i; } else { distinct++; } vis[a[i]] = true; } } for (int i = pre; i < n; i++) vis[a[i]] = false; return res; }; vector<int> ans(n+1); // int B = max(1, (int)sqrt(n * log2(n))); int B = (int)sqrt(n); for (int i = 1; i < B; i++) ans[i] = calc(i); int q = (n+B-1)/B; for (int f = 1; f <= q; f++) { int ok = n; int ng = B-1; while (ok - ng > 1) { int mid = (ok + ng) / 2; if (calc(mid) <= f) ok = mid; else ng = mid; } for (int i = ok; i <= n and ans[i] == 0; i++) ans[i] = f; } for (int i = 1; i <= n; i++) cout << ans[i] << "\n"; }