結果
| 問題 |
No.3113 The farthest point
|
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2025-04-18 21:35:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,476 ms / 2,000 ms |
| コード長 | 3,493 bytes |
| コンパイル時間 | 221 ms |
| コンパイル使用メモリ | 82,528 KB |
| 実行使用メモリ | 131,988 KB |
| 最終ジャッジ日時 | 2025-04-18 21:35:54 |
| 合計ジャッジ時間 | 25,003 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
from types import GeneratorType
def bootstrap(f, stack=[]):
def wrappedfunc(*args, **kwargs):
if stack:
return f(*args, **kwargs)
to = f(*args, **kwargs)
while True:
if type(to) is GeneratorType:
stack.append(to)
to = next(to)
else:
stack.pop()
if not stack:
break
to = stack[-1].send(to)
return to
return wrappedfunc
def segfunc(x,y):
return max(x, y)
class LazySegTree_RAQ:
def __init__(self,init_val,segfunc,ide_ele):
n = len(init_val)
self.segfunc = segfunc
self.ide_ele = ide_ele
self.num = 1<<(n-1).bit_length()
self.tree = [ide_ele]*2*self.num
self.lazy = [0]*2*self.num
for i in range(n):
self.tree[self.num+i] = init_val[i]
for i in range(self.num-1,0,-1):
self.tree[i] = self.segfunc(self.tree[2*i], self.tree[2*i+1])
def gindex(self,l,r):
l += self.num
r += self.num
lm = l>>(l&-l).bit_length()
rm = r>>(r&-r).bit_length()
ans = []
while r>l:
if l<=lm:
ans.append(l)
if r<=rm:
ans.append(r)
r >>= 1
l >>= 1
while l:
ans.append(l)
l >>= 1
return ans
def propagates(self,ids):
for i in reversed(ids):
v = self.lazy[i]
if v==0:
continue
self.lazy[i] = 0
self.lazy[2*i] += v
self.lazy[2*i+1] += v
self.tree[2*i] += v
self.tree[2*i+1] += v
def add(self,l,r,x):
ids = self.gindex(l,r)
l += self.num
r += self.num
while l<r:
if l&1:
self.lazy[l] += x
self.tree[l] += x
l += 1
if r&1:
self.lazy[r-1] += x
self.tree[r-1] += x
r >>= 1
l >>= 1
for i in ids:
self.tree[i] = self.segfunc(self.tree[2*i], self.tree[2*i+1]) + self.lazy[i]
def query(self,l,r):
self.propagates(self.gindex(l,r))
res = self.ide_ele
l += self.num
r += self.num
while l<r:
if l&1:
res = self.segfunc(res,self.tree[l])
l += 1
if r&1:
res = self.segfunc(res,self.tree[r-1])
l >>= 1
r >>= 1
return res
N = int(input())
G = [[] for _ in range(N)]
for _ in range(N-1):
u, v, w = map(int, input().split())
G[u-1].append((v-1, w))
G[v-1].append((u-1, w))
INF = 1<<60
@bootstrap
def dfs(n, pre, time, d):
A.append(n)
dist[n] = d
IN[n] = time
for v, w in G[n]:
if v == pre:
continue
time = yield dfs(v, n, time+1, d+w)
OUT[n] = time
yield time
A = []
IN = [-1]*N
OUT = [-1]*N
dist = [-1]*N
dfs(0, -1, 0, 0)
ndist = [-1]*N
for i in range(N):
ndist[i] = dist[A[i]]
dist = ndist[:]
@bootstrap
def dfs2(n, pre):
global ans
ans = max(ans, seg.query(0, N))
for v, w in G[n]:
if v == pre:
continue
seg.add(0, N, w)
seg.add(IN[v], OUT[v]+1, -(w*2))
yield dfs2(v, n)
seg.add(0, N, -w)
seg.add(IN[v], OUT[v]+1, w*2)
yield
seg = LazySegTree_RAQ(dist, segfunc, -INF)
ans = 0
dfs2(0, -1)
print(ans)
detteiuu