結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

# 
from heapq import heappop,heappush
class MinCostFlow:
inf = 10 ** 18
def __init__(self,N):
self.N = N
self.G = [[] for _ in range(N)]
self.H = [0] * N
self.first = True
self.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) - 1
def get_edge(self,i):
return self.edge[i]
def flow(self,s,t,f):
N = self.N
G = self.G
inf = MinCostFlow.inf
res = 0
H = self.H
prev_v = [0] * N
prev_e = [None] * N
d0 = [inf] * N
dist = [inf] * N
if self.first:
self.first = False
dist[:] = d0
dist[s] = 0
update = 1
while update:
update = 0
for v in range(N):
if dist[v] == inf:continue
for e in G[v]:
w,cap,cost,_ = e
if cap > 0 and dist[v] + cost < dist[w]:
dist[w] = dist[v] + cost
prev_v[w] = v
prev_e[w] = e
update = 1
H[:] = dist
if dist[t] == inf:
return None
d = f
v = t
while v != s:
d = min(d,prev_e[v][1])
v = prev_v[v]
f -= d
res += d * H[t]
v = t
while v != s:
e = prev_e[v]
e[1] -= d
e[3][1] += d
v = prev_v[v]
while f:
dist[:] = d0
dist[s] = 0
q = [(0,s)]
while q:
c,v = heappop(q)
if dist[v] < c:continue
r0 = dist[v] + H[v]
for e in G[v]:
w,cap,cost,_ = e
if cap > 0 and r0 + cost - H[w] < dist[w]:
dist[w] = r = r0 + cost - H[w]
prev_v[w] = v
prev_e[w] = e
heappush(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 = f
v = t
while v != s:
d = min(d,prev_e[v][1])
v = prev_v[v]
f -= d
res += d * H[t]
v = t
while v != s:
e = prev_e[v]
e[1] -= d
e[3][1] += d
v = prev_v[v]
return res
N = 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 += A
s = B.copy()
while len(s) < N:
s += B
n = len(l)
m = len(s)
mincost = MinCostFlow(n * m + 2)
start = 0
end = n * m + 1
for 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 = 1000
for i in range(n):
q = i // na
mincost.add_edge(start,i + 1,1,(q+1) * q * q * inf)
for j in range(m):
q = j // nb
mincost.add_edge(j + 1 + n,end,1,(q+1) * q * q * inf)
ans = -mincost.flow(start,end,N)
print(ans%inf)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0