Submission #73830299


Source Code Expand

import sys
input = sys.stdin.readline
 
def exclusive(A, zero, combine, node):
    n = len(A)
    exclusiveA = [zero] * n # Exclusive segment tree
 
    # Build exclusive segment tree
    for bit in range(n.bit_length())[::-1]:
        for i in range(n)[::-1]:
            # Propagate values down the segment tree    
            exclusiveA[i] = exclusiveA[i // 2]
        for i in range(n & ~+(bit == 0)):
            # Fold A[i] into exclusive segment tree
            ind = (i >> bit) ^ 1
            exclusiveA[ind] = combine(exclusiveA[ind], A[i], node, i)
    return exclusiveA
 
def rerooter(graph, default, combine, finalize = lambda nodeDP,node,eind: nodeDP):
    n = len(graph)
    rootDP = [0] * n
    forwardDP = [None] * n
    reverseDP = [None] * n
 
    # Compute DP for root=0
    DP = [0] * n
    bfs = [0]
    P = [0] * n
    for node in bfs:
        for nei in graph[node]:
            if P[node] != nei:
                P[nei] = node
                bfs.append(nei)
 
    for node in reversed(bfs):
        nodeDP = default[node]
        for eind, nei in enumerate(graph[node]):
            if P[node] != nei:
                nodeDP = combine(nodeDP, DP[nei], node, eind)
        DP[node] = finalize(nodeDP, node, graph[node].index(P[node]) if node else -1)
    # DP for root=0 done
    
    # Use the exclusive function to reroot 
    for node in bfs:
        DP[P[node]] = DP[node]
        forwardDP[node] = [DP[nei] for nei in graph[node]]
        rerootDP = exclusive(forwardDP[node], default[node], combine, node)
        reverseDP[node] = [finalize(nodeDP, node, eind) for eind, nodeDP in enumerate(rerootDP)]
        rootDP[node] = finalize((combine(rerootDP[0], forwardDP[node][0], node, 0) if n > 1 else default[node]), node, -1)
        for nei, dp in zip(graph[node], reverseDP[node]):
            DP[nei] = dp
    return rootDP, forwardDP, reverseDP
 
t = int(input())
for _ in range(t):
  n = int(input())
  
  graph = [[] for _ in range(n)]
  for _ in range(n - 1):
      u,v = [int(x) - 1 for x in input().split()]
      graph[u].append(v)
      graph[v].append(u)
   
  default = [0] * n
   
  def combine(nodeDP, neiDP, node, eind):
      return max(nodeDP, neiDP)
   
  def finalize(nodeDP, node, eind):
      deg = len(graph[node]) - (eind >= 0)
      if deg >= 3:
        return nodeDP + 1
      return +(deg == 2)
   
  rootDP, forwardDP, reverseDP = rerooter(graph, default, combine, finalize)
   
  print(max(rootDP))

Submission Info

Submission Time
Task F - Centipede Graph
User pajenegod
Language Python (PyPy 3.11-v7.3.20)
Score 500
Code Size 2536 Byte
Status AC
Exec Time 609 ms
Memory 181716 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 1
AC × 47
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 03_path_00.txt, 03_path_01.txt, 03_path_02.txt, 03_path_03.txt, 03_path_04.txt, 03_path_05.txt, 03_path_06.txt, 03_path_07.txt, 03_path_08.txt, 03_path_09.txt, 04_star_00.txt, 04_star_01.txt, 04_star_02.txt, 05_uni_00.txt, 05_uni_01.txt, 05_uni_02.txt, 05_uni_03.txt, 05_uni_04.txt, 05_uni_05.txt, 06_bi-ternary_00.txt, 06_bi-ternary_01.txt, 06_bi-ternary_02.txt, 06_bi-ternary_03.txt, 06_bi-ternary_04.txt, 06_bi-ternary_05.txt, 06_bi-ternary_06.txt, 06_bi-ternary_07.txt, 06_bi-ternary_08.txt, 06_bi-ternary_09.txt, 06_bi-ternary_10.txt, 06_bi-ternary_11.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 53 ms 80584 KiB
01_small_00.txt AC 291 ms 112152 KiB
01_small_01.txt AC 297 ms 112116 KiB
01_small_02.txt AC 293 ms 112308 KiB
01_small_03.txt AC 289 ms 112212 KiB
01_small_04.txt AC 387 ms 113944 KiB
01_small_05.txt AC 386 ms 114260 KiB
01_small_06.txt AC 372 ms 115456 KiB
02_random_00.txt AC 328 ms 116648 KiB
02_random_01.txt AC 306 ms 115840 KiB
02_random_02.txt AC 320 ms 116704 KiB
02_random_03.txt AC 609 ms 178840 KiB
02_random_04.txt AC 593 ms 175556 KiB
02_random_05.txt AC 557 ms 177584 KiB
02_random_06.txt AC 578 ms 179372 KiB
02_random_07.txt AC 564 ms 177000 KiB
03_path_00.txt AC 290 ms 115480 KiB
03_path_01.txt AC 280 ms 115584 KiB
03_path_02.txt AC 428 ms 162980 KiB
03_path_03.txt AC 447 ms 160540 KiB
03_path_04.txt AC 536 ms 173660 KiB
03_path_05.txt AC 536 ms 176000 KiB
03_path_06.txt AC 506 ms 176676 KiB
03_path_07.txt AC 554 ms 177036 KiB
03_path_08.txt AC 522 ms 176680 KiB
03_path_09.txt AC 544 ms 176104 KiB
04_star_00.txt AC 384 ms 181716 KiB
04_star_01.txt AC 412 ms 157292 KiB
04_star_02.txt AC 484 ms 181196 KiB
05_uni_00.txt AC 280 ms 115392 KiB
05_uni_01.txt AC 404 ms 157348 KiB
05_uni_02.txt AC 538 ms 178688 KiB
05_uni_03.txt AC 534 ms 176368 KiB
05_uni_04.txt AC 515 ms 176240 KiB
05_uni_05.txt AC 531 ms 176340 KiB
06_bi-ternary_00.txt AC 524 ms 176968 KiB
06_bi-ternary_01.txt AC 508 ms 175372 KiB
06_bi-ternary_02.txt AC 258 ms 115360 KiB
06_bi-ternary_03.txt AC 497 ms 178208 KiB
06_bi-ternary_04.txt AC 491 ms 177208 KiB
06_bi-ternary_05.txt AC 261 ms 115848 KiB
06_bi-ternary_06.txt AC 498 ms 177140 KiB
06_bi-ternary_07.txt AC 509 ms 176400 KiB
06_bi-ternary_08.txt AC 281 ms 115724 KiB
06_bi-ternary_09.txt AC 506 ms 177208 KiB
06_bi-ternary_10.txt AC 489 ms 176836 KiB
06_bi-ternary_11.txt AC 271 ms 115596 KiB