結果
問題 | No.200 カードファイト! |
ユーザー |
|
提出日時 | 2022-04-14 09:08:19 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,596 bytes |
コンパイル時間 | 373 ms |
コンパイル使用メモリ | 82,428 KB |
実行使用メモリ | 82,296 KB |
最終ジャッジ日時 | 2024-12-24 05:32:39 |
合計ジャッジ時間 | 4,331 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 WA * 5 |
ソースコード
#その3 ベルマンフォード+ダイクストラfrom heapq import heappop,heappushclass MinCostFlow:inf = 10 ** 18def __init__(self,N):self.N = Nself.G = [[] for _ in range(N)]self.H = [0] * Nself.first = Trueself.edge = []def add_edge(self,fr,to,cap,cost):e = [to,cap,cost,None]r = e[3] = [fr,0,-cost,e]self.G[fr].append(e)self.G[to].append(r)self.edge.append(e)return len(self.edge) - 1def get_edge(self,i):return self.edge[i]def flow(self,s,t,f):N = self.NG = self.Ginf = MinCostFlow.infres = 0H = self.Hprev_v = [0] * Nprev_e = [None] * Nd0 = [inf] * Ndist = [inf] * Nif self.first:self.first = Falsedist[:] = d0dist[s] = 0update = 1while update:update = 0for v in range(N):if dist[v] == inf:continuefor e in G[v]:w,cap,cost,_ = eif cap > 0 and dist[v] + cost < dist[w]:dist[w] = dist[v] + costprev_v[w] = vprev_e[w] = eupdate = 1H[:] = distif dist[t] == inf:return Noned = fv = twhile v != s:d = min(d,prev_e[v][1])v = prev_v[v]f -= dres += d * H[t]v = twhile v != s:e = prev_e[v]e[1] -= de[3][1] += dv = prev_v[v]while f:dist[:] = d0dist[s] = 0q = [(0,s)]while q:c,v = heappop(q)if dist[v] < c:continuer0 = dist[v] + H[v]for e in G[v]:w,cap,cost,_ = eif cap > 0 and r0 + cost - H[w] < dist[w]:dist[w] = r = r0 + cost - H[w]prev_v[w] = vprev_e[w] = eheappush(q,(r,w))if dist[t] == inf:return None"""for i in range(N):H[i] += dist[i]"""H = [h + d for h,d in zip(H,dist)]d = fv = twhile v != s:d = min(d,prev_e[v][1])v = prev_v[v]f -= dres += d * H[t]v = twhile v != s:e = prev_e[v]e[1] -= de[3][1] += dv = prev_v[v]return resN = int(input())na = int(input())A = list(map(int,input().split()))nb = int(input())B = list(map(int,input().split()))l = A.copy()while len(l) < N:l += As = B.copy()while len(s) < N:s += Bn = len(l)m = len(s)mincost = MinCostFlow(n * m + 2)start = 0end = n * m + 1for i in range(n):for j in range(m):if l[i] > s[j]:mincost.add_edge(i+1,j + 1 + n,1,-1)else:mincost.add_edge(i+1,j + 1 + n,1,0)inf = 1000for i in range(n):q = i // namincost.add_edge(start,i + 1,1,(q+1) * q * q * inf)for j in range(m):q = j // nbmincost.add_edge(j + 1 + n,end,1,(q+1) * q * q * inf)ans = -mincost.flow(start,end,N)print(ans%inf)