結果

問題 No.317 辺の追加
コンテスト
ユーザー tjake
提出日時 2015-12-10 14:19:50
言語 PyPy2
(7.3.15)
結果
AC  
実行時間 1,339 ms / 2,000 ms
コード長 1,074 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 207 ms
コンパイル使用メモリ 77,692 KB
最終ジャッジ日時 2025-12-03 18:29:24
ジャッジサーバーID
(参考情報)
judge1 / judge6
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 38
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

from collections import deque, Counter
from sys import stdin, stdout
ss = [map(int, s.split()) for s in stdin.readlines()]
n, m = ss[0]
n1 = n+1

parent = [1] + range(1,n1)
count = [1]*n1
def root(x):
    p = parent[x]
    if x!=p:
        parent[x] = x = root(p)
    return x
for u, v in ss[1:]:
    a = root(u); b = root(v)
    if a!=b:
        if a<b:
            parent[b] = a
            count[a] += count[b]
        else:
            parent[a] = b
            count[b] += count[a]
ct = Counter(c for i, c in enumerate(count) if parent[i]==i)

deq = deque()
clear = deq.clear
pop = deq.pop
popleft = deq.popleft
append = deq.append

dp = [-1]+[n]*n
for i, c in ct.items():
    for a in xrange(i):
        clear()
        for j, idx in enumerate(range(a, n1, i)):
            p = (dp[idx]-j, -j)
            while deq and p <= deq[-1]:
                pop()
            append(p)
            v, u = deq[0]
            dp[idx] = v + j
            if c==j+u:
                popleft()

dp = [v if v!=n else -1 for v in dp]
stdout.write("\n".join(map(str, dp[1:])) + "\n")
0