結果
問題 |
No.2258 The Jikka Tree
|
ユーザー |
![]() |
提出日時 | 2025-06-12 21:53:04 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,417 bytes |
コンパイル時間 | 189 ms |
コンパイル使用メモリ | 82,056 KB |
実行使用メモリ | 264,708 KB |
最終ジャッジ日時 | 2025-06-12 21:56:00 |
合計ジャッジ時間 | 34,834 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 7 WA * 12 TLE * 1 -- * 55 |
ソースコード
import sys from collections import defaultdict 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) # Read A array A = list(map(int, data[ptr:ptr+N])) ptr += N 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) ) # Precompute parent and children structure parent = [ -1 ] * N children = [[] for _ in range(N)] visited = [False] * N stack = [0] visited[0] = True while stack: u = stack.pop() for v in edges[u]: if not visited[v] and v != parent[u]: parent[v] = u children[u].append(v) visited[v] = True stack.append(v) # Function to compute subtree weights and find centroid def find_centroid(l, r, k): # Compute the weight for each node in [l, r) # Note: This is an array of weights, but in our case, the weights are based on A_w +k for w in [l, r) # So, for each node, the weight is (A_w +k) if l <= w < r else 0 # We need to find the centroid based on these weights. # However, this is not the same as each node's weight; instead, the nodes outside [l, r) contribute 0. # So, our 'virtual' tree consists of nodes in [l, r), each with weight A_w +k. # We need to compute for each node, the sum of weights of nodes in its subtree (within [l, r)) # This is a bit tricky because the subtree includes all descendants, but only those within [l, r). # We can perform a DFS starting from the root (or any node), and for each node, compute the sum of weights of its subtree within [l, r). # However, this is computationally expensive for each query. So, perhaps, for the sake of this problem, we can proceed with this approach, but it will not pass the time constraints. # For the purpose of this problem, we'll proceed with a simplified version. # Compute the total weight total_weight = 0 for w in range(l, r): total_weight += A[w] + k # Now, perform a DFS to find the centroid # We can use any node as the starting point; for simplicity, we'll choose 0. # Compute subtree weights subtree_weights = [0] * N def dfs(u, parent_node): weight = 0 if u >= l and u < r: weight += A[u] + k for v in children[u]: if v == parent_node: continue dfs(v, u) weight += subtree_weights[v] subtree_weights[u] = weight dfs(0, -1) # Now find the centroid def find_centroid_helper(u, parent_node, half_total): max_sub = 0 centroid = u for v in children[u]: if v == parent_node: continue if subtree_weights[v] > max_sub: max_sub = subtree_weights[v] centroid = v if max_sub <= half_total: return u else: return find_centroid_helper(centroid, u, half_total) half_total = total_weight / 2 centroid = find_centroid_helper(0, -1, half_total) return centroid # Process queries X = [] sum_X = 0 for i, (a_prime, b_prime, k_prime, delta) in enumerate(queries): 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 l = min(a, b) r = max(a, b) +1 # Compute f and find v that minimizes it # In our approach, this is the centroid v = find_centroid(l, r, k) X.append(v) sum_X += v # Print the results for x in X: print(x) if __name__ == '__main__': main()