結果

問題 No.3345 Reducible Sequence
コンテスト
ユーザー Koi
提出日時 2025-11-13 23:02:33
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 3,512 bytes
コンパイル時間 388 ms
コンパイル使用メモリ 82,712 KB
実行使用メモリ 324,392 KB
最終ジャッジ日時 2025-11-13 23:02:50
合計ジャッジ時間 16,419 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 25 TLE * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

# 1TLE😞

# Hopcroft-Karp Algorithm
from collections import deque
class HopcroftKarp:
    def __init__(self, N0, N1):
        self.N0 = N0
        self.N1 = N1
        self.N = N = 2+N0+N1
        self.G = [[] for i in range(N)]
        for i in range(N0):
            forward = [2+i, 1, None]
            forward[2] = backward = [0, 0, forward]
            self.G[0].append(forward)
            self.G[2+i].append(backward)
        self.backwards = bs = []
        for i in range(N1):
            forward = [1, 1, None]
            forward[2] = backward = [2+N0+i, 0, forward]
            bs.append(backward)
            self.G[2+N0+i].append(forward)
            self.G[1].append(backward)
 
    def add_edge(self, fr, to):
        #assert 0 <= fr < self.N0
        #assert 0 <= to < self.N1
        v0 = 2 + fr
        v1 = 2 + self.N0 + to
        forward = [v1, 1, None]
        forward[2] = backward = [v0, 0, forward]
        self.G[v0].append(forward)
        self.G[v1].append(backward)
 
    def bfs(self):
        G = self.G
        level = [None]*self.N
        deq = deque([0])
        level[0] = 0
        while deq:
            v = deq.popleft()
            lv = level[v] + 1
            for w, cap, _ in G[v]:
                if cap and level[w] is None:
                    level[w] = lv
                    deq.append(w)
        self.level = level
        return level[1] is not None
 
    def dfs(self, v, t):
        if v == t:
            return 1
        level = self.level
        for e in self.it[v]:
            w, cap, rev = e
            if cap and level[v] < level[w] and self.dfs(w, t):
                e[1] = 0
                rev[1] = 1
                return 1
        return 0
 
    def flow(self):
        flow = 0
        G = self.G
        bfs = self.bfs; dfs = self.dfs
        while bfs():
            *self.it, = map(iter, G)
            while dfs(0, 1):
                flow += 1
        return flow
 
    def matching(self):
        return [cap for _, cap, _ in self.backwards]
def main():
    N = int(input())
    A = list(map(int, input().split()))
    MA = max(A)
    L = [[] for _ in range(MA + 1)]
    for i in range(1, MA + 1):
        x = i
        while x <= MA:
            L[x].append(i)
            x += i
    if(N <= 10):
        ok = 1
        ng = N + 1
        while (ng - ok) > 1:
            mid = (ok + ng) // 2
            HK = HopcroftKarp(mid, N)
            for i in range(N):
                for x in L[A[i]]:
                    if(x <= mid):
                        HK.add_edge(x - 1, i)
                    else:
                        break
            if(HK.flow() == mid):
                ok = mid
            else:
                ng = mid
    else:
        ok = 1
        ng = N + 1
        mid = round(N * 0.8)
        HK = HopcroftKarp(mid, N)
        for i in range(N):
            for x in L[A[i]]:
                if(x <= mid):
                    HK.add_edge(x - 1, i)
                else:
                    break
        if(HK.flow() == mid):
            ok = mid
        else:
            ng = mid
        while (ng - ok) > 1:
            mid = (ok + ng) // 2
            HK = HopcroftKarp(mid, N)
            for i in range(N):
                for x in L[A[i]]:
                    if(x <= mid):
                        HK.add_edge(x - 1, i)
                    else:
                        break
            if(HK.flow() == mid):
                ok = mid
            else:
                ng = mid
    print(ok)
    
main()
0