結果
問題 | 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 sysdef 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)returnmaxA = max(A)freq = [0] * (maxA + 1)for a in A:freq[a] += 1# Compute cnt[d] for each dcnt = [0] * (maxA + 2)for d in range(1, maxA + 1):multiple = dwhile multiple <= maxA:cnt[d] += freq[multiple]multiple += d# Collect all d where cnt[d] > 0 and sort in descending orderds = [d for d in range(1, maxA + 1) if cnt[d] > 0]ds.sort(reverse=True)# Initialize the Lazy Segment Treesize = Nlst = LazySegmentTree(size)for d in ds:current_cnt = cnt[d]K_min = N - current_cntK_min = max(K_min, 0)if K_min >= N:continueK_max = N - 1if K_min > K_max:continue# Update the range [K_min, K_max] to max with dlst.update_range(K_min, K_max, d)# Collect answersans = []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 = 1while self.n < size:self.n <<= 1self.size = sizeself.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] = 0def update_range(self, a, b, val, node=1, l=0, r=None):if r is None:r = self.n - 1self.push(node, l, r)if a > r or b < l:returnif a <= l and r <= b:self.lazy[node] = max(self.lazy[node], val)self.push(node, l, r)returnmid = (l + r) // 2self.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 - 1self.push(node, l, r)if l == r:return self.tree[node]mid = (l + r) // 2if 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()