結果
| 問題 |
No.399 動的な領主
|
| コンテスト | |
| ユーザー |
timi
|
| 提出日時 | 2021-05-26 10:20:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 876 ms / 2,000 ms |
| コード長 | 1,489 bytes |
| コンパイル時間 | 316 ms |
| コンパイル使用メモリ | 82,452 KB |
| 実行使用メモリ | 222,712 KB |
| 最終ジャッジ日時 | 2024-10-15 06:43:54 |
| 合計ジャッジ時間 | 10,976 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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)
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)
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]]
A=[0]*N
Q=int(input())
for i in range(Q):
u,v=map(int, input().split())
u-=1
v-=1
d=query(u,v)
dd=P[d]
A[u]+=1
A[v]+=1
A[d]-=1
if dd!=-1:
A[dd]-=1
e=max(depth)
ans=0
for i in range(e,-1,-1):
for j in DE[i]:
d=A[j]
if j!=0:
A[P[j]]+=A[j]
ans+=(d+1)*d//2
print(ans)
timi