結果
| 問題 |
No.2258 The Jikka Tree
|
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:44:13 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,239 bytes |
| コンパイル時間 | 683 ms |
| コンパイル使用メモリ | 81,664 KB |
| 実行使用メモリ | 85,376 KB |
| 最終ジャッジ日時 | 2025-06-12 21:48:42 |
| 合計ジャッジ時間 | 14,433 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 2 WA * 1 TLE * 1 -- * 71 |
ソースコード
import sys
import bisect
sys.setrecursionlimit(1 << 25)
def main():
input = sys.stdin.read
data = input().split()
ptr = 0
N = int(data[ptr])
ptr += 1
# Read edges
edges = [[] for _ in range(N)]
for _ in range(N-1):
u = int(data[ptr])
v = int(data[ptr+1])
ptr += 2
edges[u].append(v)
edges[v].append(u)
# Compute in_order and out_order via DFS
in_order = [0] * N
out_order = [0] * N
time = 0
visited = [False] * N
def dfs(u, parent):
nonlocal time
in_order[u] = time
time += 1
for v in edges[u]:
if v != parent and not visited[v]:
visited[v] = True
dfs(v, u)
out_order[u] = time - 1
visited[0] = True
dfs(0, -1)
# Read A array
A = list(map(int, data[ptr:ptr+N]))
ptr += N
# Prefix sum of A
prefix = [0] * (N + 1)
for i in range(N):
prefix[i+1] = prefix[i] + A[i]
# Read Q
Q = int(data[ptr])
ptr += 1
queries = []
for _ in range(Q):
a_prime = int(data[ptr])
b_prime = int(data[ptr+1])
k_prime = int(data[ptr+2])
delta = int(data[ptr+3])
ptr += 4
queries.append((a_prime, b_prime, k_prime, delta))
# Process each query
X = []
sum_X = 0
for i in range(Q):
a_prime, b_prime, k_prime, delta = queries[i]
# Compute a, b, k
if i == 0:
a = a_prime
b = b_prime
k = k_prime
else:
a = (a_prime + sum_X) % N
b = (b_prime + 2 * sum_X) % N
k = (k_prime + (sum_X ** 2)) % 150001
# Compute l and r
l = min(a, b)
r = max(a, b) + 1
# Compute T
T = (prefix[r] - prefix[l]) + k * (r - l)
# Function to count nodes in [l, r) with in_order in [a, b]
def count(l, r, a, b):
count = 0
for w in range(l, r):
if in_order[w] >= a and in_order[w] <= b:
count += 1
return count
# Function to sum A_w for nodes in [l, r) with in_order in [a, b]
def sum_A(l, r, a, b):
s = 0
for w in range(l, r):
if in_order[w] >= a and in_order[w] <= b:
s += A[w]
return s
# Find the optimal node v
current_v = 0
while True:
max_sum = 0
best_child = -1
for v in edges[current_v]:
if in_order[v] < in_order[current_v]:
# This is the parent, skip
continue
# Compute sum for subtree of v
cnt = count(l, r, in_order[v], out_order[v])
s = sum_A(l, r, in_order[v], out_order[v])
sum_u = cnt * k + s
if sum_u > max_sum:
max_sum = sum_u
best_child = v
if max_sum > T / 2:
current_v = best_child
else:
break
X.append(current_v)
sum_X += current_v
# Output the results
for x in X:
print(x)
if __name__ == '__main__':
main()
gew1fw