Submission #5327273


Source Code Expand

#!/usr/bin/env python3
import sys

sys.setrecursionlimit(101010)


class UnionFind():
    def __init__(self, size):
        self.table = [-1] * size

    def find(self, x):
        while 0 <= self.table[x]:
            x = self.table[x]
        return x

    def unite(self, x, y):
        rx = self.find(x)
        ry = self.find(y)
        r = rx
        if rx != ry:
            dx = -self.table[rx]
            dy = -self.table[ry]
            if dx != dy:
                if dx < dy:
                    self.table[rx] = ry
                    r = ry
                else:
                    self.table[ry] = rx
            else:
                self.table[rx] -= 1
                self.table[ry] = rx
        return r


INT_MAX = 10 ** 20
n0 = None


class SegTree:

    def __init__(self, n):
        global n0

        self.n = n0 = n
        self.dat = [INT_MAX] * (n * 2)


    def update(self, i, x):
        i += self.n - 1
        self.dat[i] = x
        while 0 < i:
            i = (i - 1) // 2
            self.dat[i] = min(self.dat[i * 2 + 1], self.dat[i * 2 + 2])


    def query(self, a, b, k = 0, l = 0, r = None):
        if r is None:
            r = n0
        if r <= a or b <= l:
            return INT_MAX
        if a <= l and r <= b:
            return self.dat[k]
        else:
            vl = self.query(a, b, k * 2 + 1, l, (l + r) // 2)
            vr = self.query(a, b, k * 2 + 2, (l + r) // 2, r)
            return min(vl, vr)


def dfs(g, res, v, count, p, low, pre):
    pre[v] = count
    low[v] = count
    count += 1
    for w in g[v]:
        if pre[w] == -1:
            r, count = dfs(g, res, w, count, v, low, pre)
            low[v] = min(low[v], r)
            if low[w] == pre[w]:
                res.add((v, w))
                res.add((w, v))
        else:
            if p == w:
                continue
            low[v] = min(low[v], low[w])

    return low[v], count


def dfs2(tree, v, count, d, pos, depth, seg):
    pos[v] = count
    depth[v] = d
    seg.update(count, d)
    count += 1
    for w in tree[v]:
        if pos[w] == -1:
            count = dfs2(tree, w, count, d + 1, pos, depth, seg)
            pos[v] = count
            seg.update(count, d)
            count += 1

    return count


def solve(n, m, g, q, qry):

    pre = [-1] * n
    low = [-1] * n
    bridges = set()
    dfs(g, bridges, 0, 0, -1, low, pre)


    uf = UnionFind(n)
    for v in range(n):
        for w in g[v]:
            if v < w:
                if not (v, w) in bridges:
                    uf.unite(v, w)


    tree = [[] for _ in range(n)]
    for p in bridges:
        v, w = p
        rv = uf.find(v)
        rw = uf.find(w)
        tree[rv].append(rw)
        tree[rw].append(rv)
    r = -1
    for v in range(n):
        if len(tree[v]):
            r = v
            break


    if r == -1:
        for _ in qry:
            print('OK')
        return


    pos = [-1] * n
    depth = [-1] * n
    seg = SegTree(2 ** 18)
    dfs2(tree, r, 0, 0, pos, depth, seg)


    for t in qry:
        a, b, c = t
        ra = uf.find(a)
        rb = uf.find(b)
        rc = uf.find(c)
        if ra == rb or rb == rc:
            print('OK')
        elif ra == rc:
            print('NG')
        else:
            pa = pos[ra]
            pb = pos[rb]
            pc = pos[rc]
            ab = depth[ra] + depth[rb] - 2 * seg.query(min(pa, pb), max(pa, pb) + 1)
            bc = depth[rb] + depth[rc] - 2 * seg.query(min(pb, pc), max(pb, pc) + 1)
            ac = depth[ra] + depth[rc] - 2 * seg.query(min(pa, pc), max(pa, pc) + 1)
            print('OK' if ac == ab + bc else 'NG')


def main():
    n, m = input().split()
    n = int(n)
    m = int(m)
    g = [[] for _ in range(n)]
    for _ in range(m):
        x, y = input().split()
        x = int(x) - 1
        y = int(y) - 1
        g[x].append(y)
        g[y].append(x)
    q = input()
    q = int(q)
    qry = []
    for _ in range(q):
        a, b, c = input().split()
        a = int(a) - 1
        b = int(b) - 1
        c = int(c) - 1
        qry.append((a, b, c))


    solve(n, m, g, q, qry)


if __name__ == '__main__':
    main()

Submission Info

Submission Time
Task D - 旅行会社高橋君
User mugi_shiba
Language Python (3.4.3)
Score 0
Code Size 4340 Byte
Status TLE
Exec Time 3166 ms
Memory 170512 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 100
Status
AC × 3
AC × 49
TLE × 31
Set Name Test Cases
Sample sample_0.txt, sample_1.txt, sample_2.txt
All bigcycleandsub_0.txt, bigcycleandsub_1.txt, cluster_0.txt, cluster_1.txt, cluster_2.txt, cluster_3.txt, cluster_4.txt, cycleline_0.txt, cycleline_1.txt, cycleline_2.txt, cycleline_3.txt, cycleline_4.txt, cycletree_0.txt, cycletree_1.txt, cycletree_2.txt, cycletree_3.txt, cycletree_4.txt, large_0.txt, large_1.txt, large_2.txt, line_0.txt, line_1.txt, lineandsub_0.txt, lineandsub_1.txt, lineandsub_2.txt, maxrand_0.txt, maxrand_1.txt, maxrand_2.txt, maxrandandsub_0.txt, maxrandandsub_1.txt, maxrandandsub_2.txt, maxrandandsub_3.txt, maxrandandsub_4.txt, med_0.txt, med_1.txt, med_2.txt, med_3.txt, med_4.txt, med_5.txt, med_6.txt, med_7.txt, med_8.txt, med_9.txt, perfect_0.txt, perfect_1.txt, perfect_2.txt, sample_0.txt, sample_1.txt, sample_2.txt, small_0.txt, small_1.txt, small_2.txt, small_3.txt, small_4.txt, small_5.txt, small_6.txt, small_7.txt, small_8.txt, small_9.txt, star_0.txt, star_1.txt, star_2.txt, tencluster_0.txt, tencluster_1.txt, tencluster_2.txt, tencluster_3.txt, tencluster_4.txt, tree_0.txt, tree_1.txt, tree_2.txt, verysmall_0.txt, verysmall_1.txt, verysmall_2.txt, verysmall_3.txt, verysmall_4.txt, verysmall_5.txt, verysmall_6.txt, verysmall_7.txt, verysmall_8.txt, verysmall_9.txt
Case Name Status Exec Time Memory
bigcycleandsub_0.txt AC 1830 ms 131100 KB
bigcycleandsub_1.txt AC 1928 ms 131060 KB
cluster_0.txt TLE 3160 ms 69344 KB
cluster_1.txt TLE 3160 ms 69592 KB
cluster_2.txt TLE 3159 ms 68528 KB
cluster_3.txt TLE 3160 ms 69156 KB
cluster_4.txt TLE 3159 ms 68852 KB
cycleline_0.txt TLE 3159 ms 65340 KB
cycleline_1.txt TLE 3159 ms 67156 KB
cycleline_2.txt TLE 3158 ms 66528 KB
cycleline_3.txt TLE 3159 ms 65448 KB
cycleline_4.txt TLE 3159 ms 65656 KB
cycletree_0.txt TLE 3159 ms 60840 KB
cycletree_1.txt TLE 3159 ms 60832 KB
cycletree_2.txt TLE 3159 ms 60828 KB
cycletree_3.txt TLE 3159 ms 60840 KB
cycletree_4.txt TLE 3159 ms 60844 KB
large_0.txt AC 1573 ms 118160 KB
large_1.txt AC 249 ms 20816 KB
large_2.txt AC 1224 ms 111012 KB
line_0.txt TLE 3166 ms 170512 KB
line_1.txt TLE 3165 ms 141748 KB
lineandsub_0.txt TLE 3165 ms 149636 KB
lineandsub_1.txt TLE 3166 ms 169092 KB
lineandsub_2.txt TLE 3166 ms 159580 KB
maxrand_0.txt AC 1716 ms 145768 KB
maxrand_1.txt AC 1861 ms 145940 KB
maxrand_2.txt AC 1809 ms 145944 KB
maxrandandsub_0.txt AC 2217 ms 138708 KB
maxrandandsub_1.txt AC 2334 ms 138608 KB
maxrandandsub_2.txt AC 2269 ms 138480 KB
maxrandandsub_3.txt AC 2238 ms 138624 KB
maxrandandsub_4.txt AC 2345 ms 138652 KB
med_0.txt AC 31 ms 3828 KB
med_1.txt AC 26 ms 7540 KB
med_2.txt AC 25 ms 3700 KB
med_3.txt AC 27 ms 3700 KB
med_4.txt AC 36 ms 8052 KB
med_5.txt AC 28 ms 3828 KB
med_6.txt AC 34 ms 8052 KB
med_7.txt AC 33 ms 8052 KB
med_8.txt AC 24 ms 7540 KB
med_9.txt AC 27 ms 3700 KB
perfect_0.txt AC 496 ms 13440 KB
perfect_1.txt AC 415 ms 9144 KB
perfect_2.txt AC 512 ms 13504 KB
sample_0.txt AC 21 ms 7540 KB
sample_1.txt AC 22 ms 7540 KB
sample_2.txt AC 22 ms 7540 KB
small_0.txt AC 72 ms 7540 KB
small_1.txt AC 24 ms 7540 KB
small_2.txt AC 24 ms 7540 KB
small_3.txt AC 22 ms 7540 KB
small_4.txt AC 27 ms 7540 KB
small_5.txt AC 26 ms 7540 KB
small_6.txt AC 23 ms 7540 KB
small_7.txt AC 36 ms 7540 KB
small_8.txt AC 32 ms 7540 KB
small_9.txt AC 54 ms 7540 KB
star_0.txt TLE 3160 ms 88204 KB
star_1.txt TLE 3160 ms 88060 KB
star_2.txt TLE 3160 ms 88200 KB
tencluster_0.txt TLE 3160 ms 74840 KB
tencluster_1.txt TLE 3160 ms 74780 KB
tencluster_2.txt TLE 3160 ms 73604 KB
tencluster_3.txt TLE 3160 ms 76232 KB
tencluster_4.txt TLE 3160 ms 75788 KB
tree_0.txt TLE 3160 ms 87388 KB
tree_1.txt TLE 3160 ms 87348 KB
tree_2.txt TLE 3164 ms 87388 KB
verysmall_0.txt AC 22 ms 7540 KB
verysmall_1.txt AC 22 ms 7540 KB
verysmall_2.txt AC 22 ms 7540 KB
verysmall_3.txt AC 22 ms 7540 KB
verysmall_4.txt AC 22 ms 7540 KB
verysmall_5.txt AC 21 ms 7540 KB
verysmall_6.txt AC 22 ms 7540 KB
verysmall_7.txt AC 21 ms 7540 KB
verysmall_8.txt AC 22 ms 7540 KB
verysmall_9.txt AC 21 ms 7540 KB