Submission #23945713


Source Code Expand

import sys
from collections import deque

sys.setrecursionlimit(2 ** 20)

input = sys.stdin.readline


class LCATree:
    def __init__(self, edge, root=0):
        n = len(edge)
        self.__m = 1
        while (1 << self.__m) < n:
            self.__m += 1
        self.__parent = [[-1 for j in range(self.__m)] for i in range(n)]
        self.__depth = [-1 for _ in range(n)]
        self.__depth[root] = 0
        q = deque()
        q.append(root)
        while q:
            p = q.popleft()
            for e in edge[p]:
                if self.__depth[e] != -1:
                    continue
                self.__depth[e] = self.__depth[p] + 1
                self.__parent[e][0] = p
                for i in range(1, self.__m):
                    self.__parent[e][i] = self.__parent[self.__parent[e]
                                                        [i - 1]][i - 1]
                    if self.__parent[e][i] == -1:
                        break

                q.append(e)

    def __climb(self, p, l):
        for i in range(self.__m):
            if l >> i & 1:
                p = self.__parent[p][i]

        return p

    def lca(self, p, q):
        if self.__depth[p] > self.__depth[q]:
            p = self.__climb(p, self.__depth[p] - self.__depth[q])
        if self.__depth[p] < self.__depth[q]:
            q = self.__climb(q, self.__depth[q] - self.__depth[p])
        if p == q:
            return p

        for i in range(self.__m - 1, -1, -1):
            if self.__parent[p][i] != self.__parent[q][i]:
                p = self.__parent[p][i]
                q = self.__parent[q][i]

        return self.__parent[p][0]

    def dist(self, p, q):
        return (self.__depth[p] + self.__depth[q]
                - self.__depth[self.lca(p, q)] * 2)


def get_preorder(edge, root=0):

    def dfs(p, par, cnt, res):
        res[p] = cnt
        cnt += 1
        for e in edge[p]:
            if e != par:
                cnt = dfs(e, p, cnt, res)

        return cnt

    res = [-1 for _ in edge]
    dfs(root, -1, 0, res)
    return res


def main():
    n = int(input())
    edge = [[] for _ in range(n)]
    for _ in range(n - 1):
        u, v = (int(i) - 1 for i in input().split())
        edge[u].append(v)
        edge[v].append(u)

    lca = LCATree(edge)
    preorder = get_preorder(edge)
    q = int(input())
    for _ in range(q):
        v = [int(i) - 1 for i in input().split()][1:]
        v.sort(key=lambda x: preorder[x])
        print(sum(lca.dist(i, j) for i, j in zip(v, v[1:] + v[:1])) // 2)


if __name__ == "__main__":
    main()

Submission Info

Submission Time
Task 035 - Preserve Connectivity(★7)
User riantkb
Language PyPy3 (7.3.0)
Score 7
Code Size 2587 Byte
Status AC
Exec Time 1325 ms
Memory 247516 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3 Subtask4
Score / Max Score 0 / 0 2 / 2 1 / 1 1 / 1 3 / 3
Status
AC × 3
AC × 14
AC × 10
AC × 9
AC × 42
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
Subtask1 sub1_01.txt, sub1_02.txt, sub1_03.txt, sub1_04.txt, sub1_05.txt, sub1_06.txt, sub1_07.txt, sub1_08.txt, sub1_09.txt, sub1_10.txt, sub1_11.txt, sample_01.txt, sample_02.txt, sample_03.txt
Subtask2 sub2_01.txt, sub2_02.txt, sub2_03.txt, sub2_04.txt, sub2_05.txt, sub2_06.txt, sub2_07.txt, sub2_08.txt, sample_02.txt, sub1_01.txt
Subtask3 sub3_01.txt, sub3_02.txt, sub3_03.txt, sub3_04.txt, sub3_05.txt, sub3_06.txt, sub3_07.txt, sub3_08.txt, sample_03.txt
Subtask4 sample_01.txt, sample_02.txt, sample_03.txt, sub1_01.txt, sub1_02.txt, sub1_03.txt, sub1_04.txt, sub1_05.txt, sub1_06.txt, sub1_07.txt, sub1_08.txt, sub1_09.txt, sub1_10.txt, sub1_11.txt, sub2_01.txt, sub2_02.txt, sub2_03.txt, sub2_04.txt, sub2_05.txt, sub2_06.txt, sub2_07.txt, sub2_08.txt, sub3_01.txt, sub3_02.txt, sub3_03.txt, sub3_04.txt, sub3_05.txt, sub3_06.txt, sub3_07.txt, sub3_08.txt, sub4_01.txt, sub4_02.txt, sub4_03.txt, sub4_04.txt, sub4_05.txt, sub4_06.txt, sub4_07.txt, sub4_08.txt, sub4_09.txt, sub4_10.txt, sub4_11.txt, sub4_12.txt
Case Name Status Exec Time Memory
sample_01.txt AC 72 ms 65652 KiB
sample_02.txt AC 58 ms 65400 KiB
sample_03.txt AC 58 ms 65852 KiB
sub1_01.txt AC 54 ms 65752 KiB
sub1_02.txt AC 51 ms 65684 KiB
sub1_03.txt AC 56 ms 65668 KiB
sub1_04.txt AC 439 ms 85016 KiB
sub1_05.txt AC 359 ms 78948 KiB
sub1_06.txt AC 435 ms 85144 KiB
sub1_07.txt AC 367 ms 81760 KiB
sub1_08.txt AC 411 ms 84644 KiB
sub1_09.txt AC 365 ms 84400 KiB
sub1_10.txt AC 260 ms 79356 KiB
sub1_11.txt AC 343 ms 81564 KiB
sub2_01.txt AC 760 ms 131780 KiB
sub2_02.txt AC 751 ms 130572 KiB
sub2_03.txt AC 752 ms 129376 KiB
sub2_04.txt AC 1051 ms 189564 KiB
sub2_05.txt AC 886 ms 131964 KiB
sub2_06.txt AC 1124 ms 210844 KiB
sub2_07.txt AC 540 ms 128496 KiB
sub2_08.txt AC 1263 ms 237976 KiB
sub3_01.txt AC 825 ms 129984 KiB
sub3_02.txt AC 776 ms 129500 KiB
sub3_03.txt AC 786 ms 129416 KiB
sub3_04.txt AC 1110 ms 197224 KiB
sub3_05.txt AC 1019 ms 152860 KiB
sub3_06.txt AC 1193 ms 192872 KiB
sub3_07.txt AC 496 ms 126760 KiB
sub3_08.txt AC 1325 ms 247516 KiB
sub4_01.txt AC 757 ms 125552 KiB
sub4_02.txt AC 637 ms 124580 KiB
sub4_03.txt AC 671 ms 134388 KiB
sub4_04.txt AC 851 ms 129392 KiB
sub4_05.txt AC 751 ms 143976 KiB
sub4_06.txt AC 734 ms 139564 KiB
sub4_07.txt AC 497 ms 126736 KiB
sub4_08.txt AC 505 ms 126708 KiB
sub4_09.txt AC 554 ms 134948 KiB
sub4_10.txt AC 1214 ms 245844 KiB
sub4_11.txt AC 875 ms 222324 KiB
sub4_12.txt AC 947 ms 243628 KiB