結果
| 問題 | No.2311 [Cherry 5th Tune] Cherry Month |
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2023-01-05 01:07:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,948 ms / 4,600 ms |
| コード長 | 2,936 bytes |
| コンパイル時間 | 843 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 228,956 KB |
| 最終ジャッジ日時 | 2024-12-15 19:04:38 |
| 合計ジャッジ時間 | 63,701 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 51 |
ソースコード
def solve():
#==================================================
# 関数パート
def find(x):
P=[]
while UF[x]!=x:
P.append(x)
x=UF[x]
for y in P:
UF[y]=x
return x
def add_edge(x,y):
xc=find(x); yc=find(y)
G[x].append(y)
G[y].append(x)
if is_large(x):
large_nei[y].append(x)
if is_large(y):
large_nei[x].append(y)
Fall[xc][x]-=Delay[y]
Fall[yc][y]-=Delay[x]
if xc==yc:
return False
if len(Fall[xc])<len(Fall[yc]):
xc,yc=yc,xc
UF[yc]=xc
delta=Comp[xc]-Comp[yc]
Comp[yc]=0
for z in Fall[yc]:
Fall[xc][z]=Fall[yc][z]-delta
Fall[yc].clear()
return True
def is_large(i):
return deg[i]>=B
def fall_petal_individual(i,k):
Fall[find(i)][i]+=k
def get_petal(i):
petal=A[i]-(Fall[find(i)][i]+Comp[find(i)])
for j in large_nei[i]:
petal-=Delay[j]
return max(0,petal)
#==================================================
from math import sqrt, ceil
#==================================================
# 入力パート
N=int(input())
A=[0]+list(map(int,input().split()))
deg=[1]*(N+1); size=N+1
T=int(input())
F=[0]*(T+1); X=[0]*(T+1); Y=[0]*(T+1)
for t in range(1,T+1):
F[t],X[t],Y[t]=tuple(map(int,input().split()))
if F[t]==1:
deg[X[t]]+=1
deg[Y[t]]+=1
size+=1
Q=int(input())
Question=[[] for _ in range(T+1)]
for q in range(Q):
S,I=map(int,input().split())
Question[S].append((q,I))
#==================================================
# 前計算パート
B=ceil(sqrt(size))
large_nei=[[i] if is_large(i) else [] for i in range(N+1)]
UF=list(range(N+1))
Fall=[{i:0} for i in range(N+1)]
Delay=[0]*(N+1)
Comp=[0]*(N+1)
G=[[i] for i in range(N+1)]
#==================================================
# 本計算パート
Ans=[0]*Q
for t in range(T+1):
if F[t]==1:
add_edge(X[t],Y[t])
elif F[t]==2:
x=X[t]; k=Y[t]
fall_petal_individual(x,k)
elif F[t]==3:
x=X[t]; k=Y[t]
if is_large(x):
Delay[x]+=k
else:
for y in G[x]:
fall_petal_individual(y,k)
elif F[t]==4:
x=X[t]; k=Y[t]
Comp[find(x)]+=k
for q,I in Question[t]:
Ans[q]=get_petal(I)
return Ans
#==================================================
import sys
input=sys.stdin.readline
write=sys.stdout.write
write("\n".join(map(str,solve())))
Kazun