Submission #5237645


Source Code Expand

import sys
sys.setrecursionlimit(10000000)


class SegmentTree():
    def __init__(self, n):
        self.size = 1
        while self.size < n:
            self.size *= 2
        self.node = [0]*(2*self.size - 1)
        self.node_index = [0]*(2*self.size - 1)
        for i in range(self.size):
            ind = i + (self.size - 1)
            self.node_index[ind] = i
            while ind > 0:
                ind = (ind - 1) // 2
                self.node_index[ind] = self.node_index[2*ind+1]
    
    def update(self, i, val):
        i += (self.size - 1)
        self.node[i] = val
        while i > 0:
            i = (i - 1) // 2
            if self.node[2*i+1] <= self.node[2*i+2]:
                self.node[i] = self.node[2*i+1]
                self.node_index[i] = self.node_index[2*i+1]
            else:
                self.node[i] = self.node[2*i+2]
                self.node_index[i] = self.node_index[2*i+2]

    def get_min(self, begin, end, k=0, l=0, r=-1):
        begin += (self.size - 1)
        end += (self.size - 1)
        res = float("inf")
        res_index = 0
        while begin < end:
            if (end - 1) & 1:
                end -= 1
                if res > self.node[end]:
                    res = self.node[end]
                    res_index = self.node_index[end]
                elif res == self.node[end]:
                    res_index = min(res_index, self.node_index[end])
            if (begin - 1) & 1:
                if res > self.node[begin]:
                    res = self.node[begin]
                    res_index = self.node_index[begin]
                elif res == self.node[begin]:
                    res_index = min(res_index, self.node_index[begin])
                begin += 1
            begin = (begin - 1) // 2
            end = (end - 1) // 2
        return res_index, res


def dfs(node, parent_node, dep):
    id[node] = k[0]
    vs[k[0]] = node
    depth[k[0]] = dep
    k[0] += 1
    for child_node in tree[node]:
        if parent_node != child_node:
            dfs(child_node, node, dep+1)
            vs[k[0]] = node
            depth[k[0]] = dep            
            k[0] += 1
            
n = int(input())
tree = [[] for i in range(n)]
for i in range(n-1):
    node1, node2 = map(int, input().split())
    tree[node1-1].append(node2-1)
    tree[node2-1].append(node1-1)

k = [0]
id = [0]*n
depth = [0]*(2*n-1)
vs = [0]*(2*n-1)
dfs(0,-1,0)


st = SegmentTree(2*n-1)
for i in range(2*n-1):
    st.update(i, depth[i])

q = int(input())
info = [list(map(int, input().split())) for i in range(q)]

#print(vs)
#print(depth)
#print(id)
#print(st.node)
#print(st.node_index)
for i in range(q):
    begin = min(id[info[i][0]-1], id[info[i][1]-1])
    end = max(id[info[i][0]-1], id[info[i][1]-1]) + 1
    lca = vs[st.get_min(begin, end)[0]]
    print(depth[id[info[i][0]-1]] + depth[id[info[i][1]-1]] - 2*depth[id[lca]] + 1)

Submission Info

Submission Time
Task D - 閉路
User neterukun
Language PyPy3 (2.4.0)
Score 100
Code Size 2991 Byte
Status AC
Exec Time 1990 ms
Memory 161568 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 3
AC × 12
AC × 27
Set Name Test Cases
Sample subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt
Subtask2 subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Case Name Status Exec Time Memory
subtask0_sample01.txt AC 169 ms 38384 KB
subtask0_sample02.txt AC 168 ms 38256 KB
subtask0_sample03.txt AC 170 ms 38256 KB
subtask1_01.txt AC 1050 ms 146848 KB
subtask1_02.txt AC 1050 ms 146848 KB
subtask1_03.txt AC 169 ms 38256 KB
subtask1_04.txt AC 185 ms 39280 KB
subtask1_05.txt AC 244 ms 43244 KB
subtask1_06.txt AC 231 ms 41968 KB
subtask1_07.txt AC 797 ms 75168 KB
subtask1_08.txt AC 909 ms 81184 KB
subtask1_09.txt AC 914 ms 87072 KB
subtask1_10.txt AC 896 ms 87456 KB
subtask1_11.txt AC 943 ms 91936 KB
subtask1_12.txt AC 896 ms 89632 KB
subtask2_01.txt AC 1645 ms 161568 KB
subtask2_02.txt AC 1716 ms 161312 KB
subtask2_03.txt AC 890 ms 88536 KB
subtask2_04.txt AC 1145 ms 108120 KB
subtask2_05.txt AC 1188 ms 107096 KB
subtask2_06.txt AC 1145 ms 106204 KB
subtask2_07.txt AC 1987 ms 131488 KB
subtask2_08.txt AC 1979 ms 140320 KB
subtask2_09.txt AC 1990 ms 144544 KB
subtask2_10.txt AC 1883 ms 139296 KB
subtask2_11.txt AC 1839 ms 139680 KB
subtask2_12.txt AC 1953 ms 144672 KB