Submission #26094386


Source Code Expand

class PersistentPartUnionFind:
    def __init__(self,N):
        INF = float('INF')
        self.now = 0
        self.N = 0
        self.parent = [-1 for i in range(N)]
        self.time = [INF for i in range(N)]
        self.num = [[] for i in range(N)]
        for i in range(N):
            self.num[i].append((0,1))
    
    def find(self,t,x):
        '''
        version:tにおけるxの根を見つける
        t (any) : version
        x (int) : 要素
        return : int : 根
        '''
        while self.time[x] <= t:
            x = self.parent[x]
        return x
    
    def union(self,x,y):
        '''
        x,yをつなげる
        x (int) : 要素
        y (int) : 要素
        '''
        self.now += 1
        x = self.find(self.now,x)
        y = self.find(self.now,y)
 
        if x == y:
            return
        
        if self.parent[x] > self.parent[y]:
            x,y = y,x
        
        
        self.parent[x] += self.parent[y]
        self.parent[y] = x
        self.time[y] = self.now
        self.num[x].append((self.now,-self.parent[x]))
 
    def same(self,t,x,y):
        '''
        version:tにおけるx,yが同じかどうかO(logN)
        t (any) : version
        x (int) : 要素
        y (int) : 要素
        return : bool : 同じかどうか
        '''
        return self.find(t,x) == self.find(t,y)
 
    def size(self,t,x):
        '''
        version:tにおける要素xが含まれる集合の大きさ
        t (any) : version
        x (int) : 要素
        return : int :集合の大きさ  
        '''
        x = self.find(t,x)
 
        ok = 0
        ng = len(self.num[x])
        while (ng-ok > 1):
            mid = (ok+ng)>>1
            if self.num[x][mid][0] <= t:
                ok = mid
            else:
                ng = mid
        
        return self.num[x][ok][1]
 
N,Q = map(int,input().split())
version = 0
PUF = PersistentPartUnionFind(N)
lsansQ = []
for i in range(Q):
    t,u,v = map(int,input().split())
    if t == 0:
        PUF.union(u,v)
        version += 1
    else:
        lsansQ.append((version,u,v))
 
for version,u,v in lsansQ:
    if PUF.same(version,u,v):
        print(1)
    else:
        print(0)

Submission Info

Submission Time
Task A - Disjoint Set Union
User kohei2019
Language PyPy3 (7.3.0)
Score 100
Code Size 2313 Byte
Status AC
Exec Time 480 ms
Memory 117192 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 11
Set Name Test Cases
Sample example_00
All example_00, random_00, random_01, random_02, random_03, random_04, random_05, random_06, random_07, random_08, random_09
Case Name Status Exec Time Memory
example_00 AC 60 ms 62324 KiB
random_00 AC 423 ms 111484 KiB
random_01 AC 432 ms 113148 KiB
random_02 AC 355 ms 98072 KiB
random_03 AC 203 ms 113672 KiB
random_04 AC 285 ms 89676 KiB
random_05 AC 384 ms 100008 KiB
random_06 AC 367 ms 117192 KiB
random_07 AC 145 ms 95896 KiB
random_08 AC 216 ms 80860 KiB
random_09 AC 480 ms 113692 KiB