Submission #7489157


Source Code Expand

class LCA(object):
    def __init__(self,edges,root=0):
        self.edges=edges
        self.n=len(edges) # n=|V|
        # self.logn=(self.n-1).bit_length() # logn = ceil(log2(n))
        self.logn=18 # logn = ceil(log2(n))
        # initialization
        self.depth=[0]*self.n
        self.parent=[[-1]*(self.logn+1) for _ in range(self.n)] # parent[u][i]=v : uの2^i世代上がv(なければ-1)
        # construct
        self.__dfs(-1,root)
        self.__doubling()

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

    def __doubling(self):
        for i in range(self.logn):
            for v in range(self.n):
                if self.parent[v][i]!=-1: # 半分遡った時点で親が存在しなければ-1のままにしておく。-1が返るとlistの末尾の値の取得になってしまう
                    self.parent[v][i+1]=self.parent[self.parent[v][i]][i]

    def get(self,u,v): # uとvとのLCAを返す
        dd=self.depth[v]-self.depth[u]
        if dd<0: # vの方が深いようにする
            u,v=v,u
            dd=-dd

        for i in range(self.logn): # dd分だけvを遡らせる
            if dd&(1<<i): # 各bitで判定
                v=self.parent[v][i]

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

        for i in reversed(range(self.logn-1)): # そうでなければ上から二分探索
            pu,pv=self.parent[u][i],self.parent[v][i]
            if pu!=pv: u,v=pu,pv # 高さが一致してるので、片方だけ-1ということはない
        return self.parent[u][0]

#%%
# given data
N=int(input())
E=[[] for _ in range(N)]
root=0
for _ in range(N-1):
    u,v=map(lambda x:int(x)-1,input().split())
    E[u].append(v)
    E[v].append(u)
lca=LCA(E)
Q=int(input())
for _ in range(Q):
    u,v=map(lambda x:int(x)-1,input().split())
    print(lca.depth[u]+lca.depth[v]-2*lca.depth[lca.get(u,v)]+1)

Submission Info

Submission Time
Task D - 閉路
User moni0627
Language PyPy3 (2.4.0)
Score 0
Code Size 2104 Byte
Status RE
Exec Time 2110 ms
Memory 112160 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 0 / 30 0 / 70
Status
AC × 3
AC × 10
RE × 2
AC × 18
TLE × 5
RE × 4
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 164 ms 38256 KB
subtask0_sample03.txt AC 164 ms 38256 KB
subtask1_01.txt RE 691 ms 84384 KB
subtask1_02.txt RE 696 ms 84384 KB
subtask1_03.txt AC 164 ms 38256 KB
subtask1_04.txt AC 169 ms 38512 KB
subtask1_05.txt AC 216 ms 41328 KB
subtask1_06.txt AC 213 ms 40432 KB
subtask1_07.txt AC 846 ms 86176 KB
subtask1_08.txt AC 842 ms 91168 KB
subtask1_09.txt AC 919 ms 98848 KB
subtask1_10.txt AC 974 ms 102560 KB
subtask1_11.txt AC 934 ms 100512 KB
subtask1_12.txt AC 885 ms 98848 KB
subtask2_01.txt RE 712 ms 84384 KB
subtask2_02.txt RE 703 ms 84384 KB
subtask2_03.txt AC 1212 ms 55000 KB
subtask2_04.txt AC 1228 ms 57560 KB
subtask2_05.txt AC 1290 ms 58968 KB
subtask2_06.txt AC 1289 ms 59868 KB
subtask2_07.txt AC 1991 ms 103072 KB
subtask2_08.txt TLE 2092 ms 104224 KB
subtask2_09.txt TLE 2110 ms 105760 KB
subtask2_10.txt TLE 2066 ms 109676 KB
subtask2_11.txt TLE 2110 ms 108960 KB
subtask2_12.txt TLE 2110 ms 112160 KB