結果
| 問題 | No.399 動的な領主 |
| コンテスト | |
| ユーザー |
timi
|
| 提出日時 | 2023-05-18 11:37:39 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 781 ms / 2,000 ms |
| コード長 | 1,641 bytes |
| コンパイル時間 | 151 ms |
| コンパイル使用メモリ | 82,452 KB |
| 実行使用メモリ | 227,732 KB |
| 最終ジャッジ日時 | 2024-12-16 03:41:11 |
| 合計ジャッジ時間 | 11,084 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 |
ソースコード
N=int(input())
D=[[] for i in range(N)]
G=[[] for i in range(N)]
S=[]
F=[0]*N
for i in range(N-1):
u,v=map(int, input().split())
u-=1;v-=1
D[u].append(v)
D[v].append(u)
#根が決められておらず、Dでとりあえず双方向を記録し、Gで方向を決めている
DIN=[-1]*N
DOU=[-1]*N
depth=[-1]*N
import sys
sys.setrecursionlimit(10**9)
k=0
P=[-1]*N
def dfs(v,d,pre):
F[v]=len(S)
global k
DIN[v]=k
k+=1
depth[v]=d
S.append(v)
P[v]=pre
for u in D[v]:
if u!=pre:
G[v].append(u)
dfs(u,d+1,v)
S.append(v)
DOU[v]=k
k+=1
dfs(0,0,0)
P[0]=-1
DE={}
for i in range(N):
if depth[i] not in DE:
DE[depth[i]]=[i]
else:
DE[depth[i]].append(i)
#LCA
M=2*N
INF=(N,None)
M0=2**(M-1).bit_length()
data=[INF]*(2*M0)
for i, v in enumerate(S):
data[M0-1+i]=(depth[v],i)
for i in range(M0-2, -1, -1):
data[i]=min(data[2*i+1], data[2*i+2])
def _query(a, b):
yield INF
a += M0; b += M0
while a < b:
if b & 1:
b -= 1
yield data[b-1]
if a & 1:
yield data[a-1]
a += 1
a >>= 1; b >>= 1
# LCAの計算 (外から呼び出す関数)
def query(u, v):
fu = F[u]; fv = F[v]
if fu > fv:
fu, fv = fv, fu
return S[min(_query(fu, fv+1))[1]]
E=[0]*N
Q=int(input())
for i in range(Q):
u,v=map(int, input().split())
u-=1;v-=1
E[u]+=1;E[v]+=1
c=query(u,v)
cc=P[c]
E[c]-=1
if cc!=-1:
E[cc]-=1
ans=[0]*N
EE=sorted(list(set(depth)))[::-1]
for e in EE:
for now in DE[e]:
c=E[now]
for ch in G[now]:
c+=ans[ch]
ans[now]=c
c=0
for i in ans:
c+=i*(i+1)//2
print(c)
timi