結果

問題 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()
0