Submission #23943439


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 Python (3.8.2)
Score 2
Code Size 2587 Byte
Status TLE
Exec Time 2209 ms
Memory 165336 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3 Subtask4
Score / Max Score 0 / 0 2 / 2 0 / 1 0 / 1 0 / 3
Status
AC × 3
AC × 14
AC × 6
TLE × 4
AC × 5
TLE × 4
AC × 32
TLE × 10
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 27 ms 9212 KiB
sample_02.txt AC 24 ms 9448 KiB
sample_03.txt AC 27 ms 9504 KiB
sub1_01.txt AC 23 ms 9436 KiB
sub1_02.txt AC 19 ms 9316 KiB
sub1_03.txt AC 21 ms 9204 KiB
sub1_04.txt AC 910 ms 11532 KiB
sub1_05.txt AC 809 ms 11360 KiB
sub1_06.txt AC 903 ms 11424 KiB
sub1_07.txt AC 788 ms 13536 KiB
sub1_08.txt AC 912 ms 11608 KiB
sub1_09.txt AC 673 ms 15664 KiB
sub1_10.txt AC 634 ms 11640 KiB
sub1_11.txt AC 605 ms 15680 KiB
sub2_01.txt AC 1981 ms 59484 KiB
sub2_02.txt AC 1973 ms 59532 KiB
sub2_03.txt AC 1994 ms 59240 KiB
sub2_04.txt TLE 2208 ms 91936 KiB
sub2_05.txt TLE 2207 ms 64244 KiB
sub2_06.txt TLE 2208 ms 105152 KiB
sub2_07.txt AC 1407 ms 60064 KiB
sub2_08.txt TLE 2209 ms 135776 KiB
sub3_01.txt AC 1931 ms 59340 KiB
sub3_02.txt AC 1941 ms 59424 KiB
sub3_03.txt AC 1926 ms 59228 KiB
sub3_04.txt TLE 2209 ms 125216 KiB
sub3_05.txt TLE 2208 ms 80040 KiB
sub3_06.txt TLE 2208 ms 96252 KiB
sub3_07.txt AC 1367 ms 59848 KiB
sub3_08.txt TLE 2209 ms 148212 KiB
sub4_01.txt AC 1814 ms 59404 KiB
sub4_02.txt AC 1822 ms 59376 KiB
sub4_03.txt AC 1657 ms 62444 KiB
sub4_04.txt TLE 2098 ms 64696 KiB
sub4_05.txt AC 1993 ms 76704 KiB
sub4_06.txt AC 1808 ms 68436 KiB
sub4_07.txt AC 1263 ms 59684 KiB
sub4_08.txt AC 1272 ms 60040 KiB
sub4_09.txt AC 1282 ms 62832 KiB
sub4_10.txt TLE 2153 ms 165336 KiB
sub4_11.txt AC 1839 ms 147148 KiB
sub4_12.txt AC 1762 ms 131064 KiB