Um_nik

Untitled

May 29th, 2025
630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.67 KB | None | 0 0
  1. n, m = map(int, input().split())
  2. hands = [tuple(map(int, input().split())) for _ in range(n)]
  3. _cuts = [tuple(map(int, input().split())) for _ in range(m)]
  4. edges = [[] for u in range(n + 1)]
  5. edge_cnt = [{} for u in range(n + 1)]
  6.  
  7. for u, (l, r) in enumerate(hands, 1):
  8.     for v in [l, r]:
  9.         if v == -1:
  10.             continue
  11.         _u, _v = min(u, v), max(u, v)
  12.         edge_cnt[_u][_v] = edge_cnt[_u].get(_v, 0) + 1
  13.  
  14. cuts = [
  15.     (min(u, v), max(u, v))
  16.     for m, lr in _cuts
  17.     if (u := m) and (v := hands[m - 1][lr - 1])
  18. ]
  19.  
  20. for u, v in cuts:
  21.     edge_cnt[u][v] -= 1
  22.  
  23. for u in range(1, n + 1):
  24.     for v in edge_cnt[u]:
  25.         if edge_cnt[u][v] > 0:
  26.             edges[u].append(v)
  27.  
  28. res, rank = [-1]*(n + 1), [0]*(n + 1)
  29. p = [i for i in range(n + 1)]
  30. c = [set() for i in range(n + 1)]
  31.  
  32. def get(x):
  33.     stk = []
  34.     while x != p[x]:
  35.         stk.append(x)
  36.         x = p[x]
  37.     for i in stk:
  38.         c[p[i]].remove(i)
  39.         c[x].add(i)
  40.         p[i] = x
  41.     return x
  42.  
  43. def union(u, v):
  44.     pu, pv = get(u), get(v)
  45.     if pu == pv:
  46.         return
  47.     if rank[pu] == rank[pv]:
  48.         rank[pu] += 1
  49.     if rank[pu] < rank[pv]:
  50.         pu, pv = pv, pu
  51.     p[pv] = pu
  52.     c[pu].add(pv)
  53.  
  54. def set(x, idx):
  55.     stk = [x]
  56.     while stk:
  57.         cur = stk.pop()
  58.         res[cur] = idx
  59.         stk.extend(c[cur])
  60.  
  61. for u in range(1, n + 1):
  62.     for v in edges[u]:
  63.         union(u, v)
  64.  
  65. for idx, (u, v) in list(enumerate(cuts))[::-1]:
  66.     p1, pu, pv = get(1), get(u), get(v)
  67.     if pu == pv == p1:
  68.         continue
  69.     if p1 in [pu, pv]:
  70.         set(pu, idx) if pu != p1 else set(pv, idx)
  71.     union(u, v)
  72.  
  73. print("\n".join(map(str, res[1:])))
  74.  
Advertisement
Add Comment
Please, Sign In to add comment