結果

問題 No.1730 GCD on Blackboard in yukicoder
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0