ntk log ntk

競プロや非競技プロのやったことを書いています.

Code Formula 2014 予選A C - 決勝進出者

C - 決勝進出者

何人かのコードを見た感じ,これ人によって解法違いそう.

解法

(順位,予選時期,ID)をタプルとし,heapqに入れていく. 予選ごとにheapqを見て,(取り出した値から将来負けうる人数)+ (既に通過した人数)がK未満だったらその予選時にメールを送る. 取り出した値から将来負けうる人数は,(順位 - 1)*(N - i - 1)となる.

提出コード

コード

def main():
    N, K = (int(i) for i in input().split())
    A = [[int(i) for i in input().split()] for j in range(N)]
    from heapq import heappop, heappush
    hque = []
    passed = set()
    for i in range(N):
        ans = []
        for j, a in enumerate(A[i], start=1):
            # (順位,予選時期,ID)
            heappush(hque, (j, i, a))
        for _ in range(len(hque)):
            (jj, ii, aa) = heappop(hque)
            v = (jj - 1)*(N - i - 1)
            if aa not in passed and len(passed) + v < K:
                ans.append(aa)
                passed.add(aa)
            elif aa not in passed:
                heappush(hque, (jj, ii, aa))
        ans.sort()
        print(*ans)


if __name__ == '__main__':
    main()


あさかつのEで出たんだけど,通せなかったのでLorentさんのツイートを見て通した. 上のコードはPyPyだとMLEする.なんか無駄なことをしてそうな?感じもするので,他の人のコードも参考にするのがよさそう. 記事投稿時にはPyPy(7.3.0)のACがなかった.judge-update-202004以前の提出も見たい場合,この拡張を入れるのがおすすめ.