結果
問題 |
No.1730 GCD on Blackboard in yukicoder
|
ユーザー |
![]() |
提出日時 | 2025-03-26 15:53:19 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,793 bytes |
コンパイル時間 | 198 ms |
コンパイル使用メモリ | 82,600 KB |
実行使用メモリ | 164,072 KB |
最終ジャッジ日時 | 2025-03-26 15:54:05 |
合計ジャッジ時間 | 22,075 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 12 TLE * 6 -- * 6 |
ソースコード
import sys def main(): input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) if not A: for _ in range(N): print(0) return maxA = max(A) freq = [0] * (maxA + 1) for a in A: freq[a] += 1 # Compute cnt[d] for each d cnt = [0] * (maxA + 2) for d in range(1, maxA + 1): multiple = d while multiple <= maxA: cnt[d] += freq[multiple] multiple += d # Collect all d where cnt[d] > 0 and sort in descending order ds = [d for d in range(1, maxA + 1) if cnt[d] > 0] ds.sort(reverse=True) # Initialize the Lazy Segment Tree size = N lst = LazySegmentTree(size) for d in ds: current_cnt = cnt[d] K_min = N - current_cnt K_min = max(K_min, 0) if K_min >= N: continue K_max = N - 1 if K_min > K_max: continue # Update the range [K_min, K_max] to max with d lst.update_range(K_min, K_max, d) # Collect answers ans = [] for k in range(N): ans_k = lst.query_point(k) ans.append(ans_k) print('\n'.join(map(str, ans))) class LazySegmentTree: def __init__(self, size): self.n = 1 while self.n < size: self.n <<= 1 self.size = size self.tree = [0] * (2 * self.n) self.lazy = [0] * (2 * self.n) def push(self, node, l, r): if self.lazy[node] != 0: self.tree[node] = max(self.tree[node], self.lazy[node]) if l != r: self.lazy[2 * node] = max(self.lazy[2 * node], self.lazy[node]) self.lazy[2 * node + 1] = max(self.lazy[2 * node + 1], self.lazy[node]) self.lazy[node] = 0 def update_range(self, a, b, val, node=1, l=0, r=None): if r is None: r = self.n - 1 self.push(node, l, r) if a > r or b < l: return if a <= l and r <= b: self.lazy[node] = max(self.lazy[node], val) self.push(node, l, r) return mid = (l + r) // 2 self.update_range(a, b, val, 2 * node, l, mid) self.update_range(a, b, val, 2 * node + 1, mid + 1, r) self.tree[node] = max(self.tree[2 * node], self.tree[2 * node + 1]) def query_point(self, idx, node=1, l=0, r=None): if r is None: r = self.n - 1 self.push(node, l, r) if l == r: return self.tree[node] mid = (l + r) // 2 if idx <= mid: return self.query_point(idx, 2 * node, l, mid) else: return self.query_point(idx, 2 * node + 1, mid + 1, r) if __name__ == '__main__': main()