Submission #7492266


Source Code Expand

import sys
sys.setrecursionlimit(2147483647)
INF=float("inf")
MOD=10**9+7
input=sys.stdin.readline
def resolve():
    class LCA:
        """
        construct: O(NlogN)
        query: 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) # n=|V|
            self.logn = (self.n-1).bit_length() # logn=ceil(log2(n))
            self.depths = [-1] * self.n
            self.parents = [[-1] * self.n for _ in range(self.logn)]
            # construct
            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 self.depths[v]==-1: # 深さ-1=訪れていない(rootから連結な部分しか探索しない)
                    self.__dfs(cur,v,dep+1)

        def __doubling(self):
            for i in range(1,self.logn):
                for v in range(self.n):
                    if self.parents[i-1][v]==-1: # 親が存在しないとき。-1を通すとlistの末尾を取得してしまう
                        continue
                    self.parents[i][v]=self.parents[i-1][self.parents[i-1][v]]

        def get(self,u,v): # u,vのLCAを返す
            dd=self.depths[v]-self.depths[u]
            if dd<0: # vの方が深いようにする
                u,v=v,u
                dd*=-1
            for i in range(self.logn):
                if dd&(1<<i):
                    v = self.parents[i][v]

            if v==u: return v # 高さ揃えた時点で一致してたら終わり

            # そうでなければ上から二分探索
            for i in reversed(range(self.logn)):
                pu,pv=self.parents[i][u],self.parents[i][v]
                if pu!=pv:
                    u,v=pu,pv
            return self.parents[0][u]

    n=int(input())
    edges=[[] for _ in range(n)]
    for _ in range(n-1):
        x,y=map(lambda x:int(x)-1,input().split())
        edges[x].append(y)
        edges[y].append(x)
    lca=LCA(edges)
    for _ in range(int(input())):
        x,y=map(lambda x:int(x)-1,input().split())
        print(lca.depths[x]+lca.depths[y]-2*lca.depths[lca.get(x,y)]+1)


resolve()

Submission Info

Submission Time
Task D - 閉路
User moni0627
Language PyPy3 (2.4.0)
Score 100
Code Size 2455 Byte
Status AC
Exec Time 1080 ms
Memory 151984 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 172 ms 38256 KB
subtask0_sample02.txt AC 171 ms 38256 KB
subtask0_sample03.txt AC 179 ms 38256 KB
subtask1_01.txt AC 593 ms 142768 KB
subtask1_02.txt AC 585 ms 142640 KB
subtask1_03.txt AC 173 ms 38384 KB
subtask1_04.txt AC 173 ms 38256 KB
subtask1_05.txt AC 200 ms 40816 KB
subtask1_06.txt AC 183 ms 39792 KB
subtask1_07.txt AC 459 ms 71456 KB
subtask1_08.txt AC 518 ms 76960 KB
subtask1_09.txt AC 502 ms 80700 KB
subtask1_10.txt AC 527 ms 81568 KB
subtask1_11.txt AC 560 ms 86048 KB
subtask1_12.txt AC 545 ms 85408 KB
subtask2_01.txt AC 809 ms 151728 KB
subtask2_02.txt AC 835 ms 151984 KB
subtask2_03.txt AC 512 ms 61400 KB
subtask2_04.txt AC 520 ms 61656 KB
subtask2_05.txt AC 582 ms 64728 KB
subtask2_06.txt AC 567 ms 63068 KB
subtask2_07.txt AC 1027 ms 95136 KB
subtask2_08.txt AC 993 ms 95008 KB
subtask2_09.txt AC 1037 ms 97312 KB
subtask2_10.txt AC 1016 ms 98208 KB
subtask2_11.txt AC 1080 ms 101152 KB
subtask2_12.txt AC 1057 ms 100768 KB