Submission #7490059


Source Code Expand

def resolve():
    import math
    import sys
    sys.setrecursionlimit(2147483647)
    class DoublingLCA:
        """
        LCA ダブリング版
        初期化 O(NlogN)、クエリ O(logN)
        """

        def __init__(self,edges,root=0):
            """
            :param list of (list of int) edges:
            :param int root=0:
            """
            self.edges = edges
            self.n = len(edges)
            self.root = root

            self.MAX_LOG_V = self.n.bit_length()
            self.depths = [-1] * self.n
            self.parents = [[-1] * self.n for _ in range(self.MAX_LOG_V)]

            self.__dfs(-1,root,0)
            self.__doubling()

        def __dfs(self,par,cur,dep):
            self.depths[cur]=dep
            self.parents[0][cur]=par
            for v in self.edges[cur]:
                if v!=par:
                    self.__dfs(cur,v,dep+1)

        def __doubling(self):
            for k in range(self.MAX_LOG_V - 1):
                for v in range(self.n):
                    if self.parents[k][v] < 0: # 親がない
                        continue
                    self.parents[k+1][v]=self.parents[k][self.parents[k][v]]

        def get(self, u, v):
            # 深さを合わせる
            if self.depths[u] > self.depths[v]:
                u, v = v, u
            for k in range(self.MAX_LOG_V):
                if (self.depths[v] - self.depths[u]) >> k & 1:
                    v = self.parents[k][v]
            if v == u:
                return v

            # にぶたん
            for k in reversed(range(self.MAX_LOG_V)):
                if self.parents[k][u] != self.parents[k][v]:
                    u = self.parents[k][u]
                    v = self.parents[k][v]
            return self.parents[0][u]

        def distance(self, u, v):
            """
            u, v 間の距離
            depth[u] + depth[v] - depth[lca]*2
            :param u:
            :param v:
            :rtype: int
            """
            lca = self.get(u, v)
            return self.depths[u] + self.depths[v] - self.depths[lca] * 2


    N = int(input())
    XY = [list(map(int, input().split())) for _ in range(N - 1)]
    Q = int(input())
    AB = [list(map(int, input().split())) for _ in range(Q)]

    edges = [[] for _ in range(N + 1)]
    for x, y in XY:
        edges[x - 1].append(y - 1)
        edges[y - 1].append(x - 1)
    LCA = DoublingLCA(edges=edges)

    for a, b in AB:
        d = LCA.distance(a - 1, b - 1)
        print(d + 1)

resolve()

Submission Info

Submission Time
Task D - 閉路
User moni0627
Language PyPy3 (2.4.0)
Score 100
Code Size 2627 Byte
Status AC
Exec Time 1646 ms
Memory 203736 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 174 ms 38256 KB
subtask0_sample02.txt AC 170 ms 38256 KB
subtask0_sample03.txt AC 178 ms 38256 KB
subtask1_01.txt AC 1011 ms 176088 KB
subtask1_02.txt AC 1035 ms 176088 KB
subtask1_03.txt AC 169 ms 38256 KB
subtask1_04.txt AC 175 ms 38256 KB
subtask1_05.txt AC 230 ms 41712 KB
subtask1_06.txt AC 222 ms 40688 KB
subtask1_07.txt AC 756 ms 90712 KB
subtask1_08.txt AC 821 ms 96600 KB
subtask1_09.txt AC 867 ms 102360 KB
subtask1_10.txt AC 887 ms 98520 KB
subtask1_11.txt AC 848 ms 106968 KB
subtask1_12.txt AC 867 ms 105048 KB
subtask2_01.txt AC 1545 ms 203612 KB
subtask2_02.txt AC 1565 ms 203736 KB
subtask2_03.txt AC 811 ms 78296 KB
subtask2_04.txt AC 840 ms 78808 KB
subtask2_05.txt AC 880 ms 83928 KB
subtask2_06.txt AC 857 ms 83032 KB
subtask2_07.txt AC 1527 ms 127192 KB
subtask2_08.txt AC 1499 ms 125784 KB
subtask2_09.txt AC 1611 ms 121944 KB
subtask2_10.txt AC 1646 ms 122456 KB
subtask2_11.txt AC 1638 ms 120536 KB
subtask2_12.txt AC 1634 ms 121304 KB