結果
| 問題 |
No.1424 Ultrapalindrome
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2021-03-12 21:55:33 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 289 ms / 2,000 ms |
| コード長 | 2,868 bytes |
| コンパイル時間 | 86 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 32,128 KB |
| 最終ジャッジ日時 | 2024-10-14 16:14:26 |
| 合計ジャッジ時間 | 5,438 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
import sys
sys.setrecursionlimit(10**6)
int1 = lambda x: int(x)-1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.buffer.readline())
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def LI1(): return list(map(int1, sys.stdin.buffer.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
def BI(): return sys.stdin.buffer.readline().rstrip()
def SI(): return sys.stdin.buffer.readline().rstrip().decode()
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0)]
dij = [(0, 1), (-1, 0), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
inf = 10**16
# md = 998244353
md = 10**9+7
class LCA:
# 頂点は0~n-1
def __init__(self, to, root=0):
self.to = to
self.n = len(to)
self.parents = [-1] * (self.n+1)
self.depth = [0] * self.n
self.__dfs(root)
self.max_level = max(self.depth).bit_length()
self.ancestor = [self.parents]+[[-1] * (self.n+1) for _ in range(self.max_level)]
row0=self.ancestor[0]
for lv in range(self.max_level):
row1=self.ancestor[lv+1]
for u in range(self.n):
row1[u]=row0[row0[u]]
row0=row1
def __dfs(self, root):
stack=[root]
while stack:
u=stack.pop()
pu=self.parents[u]
du=self.depth[u]
for v in self.to[u]:
if v==pu:continue
self.parents[v]=u
self.depth[v]=du+1
stack.append(v)
# 最小共通祖先
def anc(self,u,v):
diff=self.depth[u]-self.depth[v]
if diff<0:u,v=v,u
diff=abs(diff)
lv=0
while diff:
if diff&1:u=self.ancestor[lv][u]
lv,diff=lv+1,diff>>1
if u==v:return u
for lv in range(self.depth[u].bit_length()-1,-1,-1):
anclv=self.ancestor[lv]
if anclv[u]!=anclv[v]:u,v=anclv[u],anclv[v]
return self.parents[u]
n=II()
if n==2:
print("Yes")
exit()
to=[[] for _ in range(n)]
deg=[0]*n
for _ in range(n-1):
u,v=LI1()
to[u].append(v)
to[v].append(u)
deg[u]+=1
deg[v]+=1
def ok():
c1=deg.count(1)
c2=deg.count(2)
if c1==2 and c2==n-2:
return True
elif c1+c2==n-1:
mx=max(deg)
root=deg.index(mx)
stack=[root]
dep=[-1]*n
dep[root]=0
while stack:
u=stack.pop()
for v in to[u]:
if dep[v]!=-1:continue
dep[v]=dep[u]+1
stack.append(v)
d=-1
for u in range(n):
if deg[u]==1:
if d==-1:d=dep[u]
elif dep[u]!=d:return False
return True
else:
return False
print("Yes" if ok() else "No")
mkawa2