結果

問題 No.2325 Skill Tree
ユーザー katonyonkokatonyonko
提出日時 2023-05-28 14:23:29
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,912 bytes
コンパイル時間 416 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 204,568 KB
最終ジャッジ日時 2024-06-08 05:19:53
合計ジャッジ時間 37,161 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 39 ms
58,752 KB
testcase_01 AC 38 ms
52,864 KB
testcase_02 AC 40 ms
53,120 KB
testcase_03 AC 39 ms
52,992 KB
testcase_04 AC 39 ms
52,864 KB
testcase_05 AC 38 ms
53,212 KB
testcase_06 AC 40 ms
53,120 KB
testcase_07 AC 583 ms
116,864 KB
testcase_08 AC 635 ms
117,248 KB
testcase_09 AC 733 ms
127,836 KB
testcase_10 AC 927 ms
134,256 KB
testcase_11 AC 875 ms
136,772 KB
testcase_12 AC 1,682 ms
186,896 KB
testcase_13 AC 1,626 ms
186,960 KB
testcase_14 AC 1,804 ms
186,520 KB
testcase_15 AC 1,850 ms
187,160 KB
testcase_16 AC 1,621 ms
186,580 KB
testcase_17 AC 1,174 ms
166,808 KB
testcase_18 AC 1,190 ms
166,656 KB
testcase_19 AC 1,171 ms
166,452 KB
testcase_20 AC 1,209 ms
166,528 KB
testcase_21 AC 1,154 ms
166,136 KB
testcase_22 AC 2,006 ms
204,568 KB
testcase_23 AC 2,041 ms
204,320 KB
testcase_24 AC 1,984 ms
203,308 KB
testcase_25 AC 1,998 ms
201,564 KB
testcase_26 AC 2,002 ms
202,668 KB
testcase_27 TLE -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

import io
import sys

_INPUT = """\
6
5
5 1
10 1
8 3
38 4
7
1 1
1 8
1 10
2 2
2 3
2 4
2 5
4
10 4
10 2
10 3
5
1 1
1 10
2 2
2 3
2 4
"""

def solve(test):
  import sys
  sys.setrecursionlimit(10**6)
  class UnionFind():
    def __init__(self, n):
      self.n = n
      self.parents = [-1] * n
    def find(self, x):
      if self.parents[x] < 0:
        return x
      else:
        self.parents[x] = self.find(self.parents[x])
        return self.parents[x]
    def union(self, x, y):
      x = self.find(x)
      y = self.find(y)
      if x == y:
        return
      if self.parents[x] > self.parents[y]:
        x, y = y, x
      self.parents[x] += self.parents[y]
      self.parents[y] = x
    def size(self, x):
      return -self.parents[self.find(x)]
    def same(self, x, y):
      return self.find(x) == self.find(y)
    def members(self, x):
      root = self.find(x)
      return [i for i in range(self.n) if self.find(i) == root]
    def roots(self):
      return [i for i, x in enumerate(self.parents) if x < 0]
    def group_count(self):
      return len(self.roots())
    def all_group_members(self):
      return {r: self.members(r) for r in self.roots()}
    def __str__(self):
      return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())

  N=int(input())
  W=[list(map(int,input().split())) for _ in range(N-1)]
  W=[(W[i][0],W[i][1]-1,i+1) for i in range(N-1)]
  Q=int(input())
  inf=10**20
  L=[-1]*N
  query=[list(map(int,input().split())) for _ in range(Q)]
  query1=[(query[i][1],inf,i) for i in range(Q) if query[i][0]==1]
  ans=[-1]*Q
  tmp=sorted(W+query1,key=lambda x: (x[0],x[1]))
  uf=UnionFind(N)
  for i in range(len(tmp)):
    l,t,idx=tmp[i]
    if t==10**20: ans[idx]=uf.size(0)
    else:
      # print(t)
      if uf.find(t)==uf.find(0) and uf.find(idx)!=uf.find(0):
        tt=uf.members(idx)
        for mem in tt:
          L[mem]=l
      if uf.find(idx)==uf.find(0) and uf.find(t)!=uf.find(0):
        tt=uf.members(t)
        for mem in tt:
          L[mem]=l
      uf.union(t,idx)
  for i in range(Q):
    d,y=query[i]
    if d==2:
      ans[i]=L[y-1]
  if test==0:
    print(*ans,sep='\n')
  else:
    return None

def random_input():
  from random import randint,shuffle
  N=randint(1,10)
  M=randint(1,N)
  A=list(range(1,M+1))+[randint(1,M) for _ in range(N-M)]
  shuffle(A)
  return (" ".join(map(str, [N,M]))+"\n"+" ".join(map(str, A))+"\n")*3

def simple_solve():
  return []

def main(test):
  if test==0:
    solve(0)
  elif test==1:
    sys.stdin = io.StringIO(_INPUT)
    case_no=int(input())
    for _ in range(case_no):
      solve(0)
  else:
    for i in range(1000):
      sys.stdin = io.StringIO(random_input())
      x=solve(1)
      y=simple_solve()
      if x!=y:
        print(i,x,y)
        print(*[line for line in sys.stdin],sep='')
        break

#0:提出用、1:与えられたテスト用、2:ストレステスト用
main(0)
0