結果
問題 |
No.3269 Leq-K Partition
|
ユーザー |
![]() |
提出日時 | 2025-09-12 22:12:00 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 5,935 ms / 6,000 ms |
コード長 | 1,094 bytes |
コンパイル時間 | 16,071 ms |
コンパイル使用メモリ | 311,412 KB |
実行使用メモリ | 14,292 KB |
最終ジャッジ日時 | 2025-09-12 23:41:19 |
合計ジャッジ時間 | 82,809 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
n = read_line.to_i a = read_line.split.map(&.to_i) max = a.uniq.size ans = Array.new(n + 1, 1) mid = (n ** 0.5).to_i 1.upto(mid) do |i| ans[i] = solve1(a, i) end prev = mid + 1 (ans[mid] - 1).downto(1) do |i| c = solve2(a, i, max) prev.upto(c - 1) { |j| ans[j] = i + 1 } prev = c end puts ans[1..].join("\n") def solve1(a, k) used = Array.new(a.size + 1, false) g = [] of Int32 cnt = 1 a.size.times do |i| if !used[a[i]] if g.size == k cnt += 1 g.each { |v| used[v] = false } g.clear end used[a[i]] = true g << a[i] end end cnt end def solve2(a, l, max) lo = 0 hi = max used = Array.new(a.size + 1, false) while hi - lo > 1 k = (lo + hi) // 2 g = [] of Int32 cnt = 1 a.size.times do |i| if !used[a[i]] if g.size == k cnt += 1 g.each { |v| used[v] = false } g.clear end used[a[i]] = true g << a[i] end end g.each { |v| used[v] = false } if cnt <= l hi = k else lo = k end end hi end