https://www.acmicpc.net/problem/17469
[사용한 알고리즘]
Smaller to Larger Technique
https://justicehui.github.io/medium-algorithm/2019/09/23/small-to-large/
이 글을 통해 공부했습니다
1. 쿼리를 뒤집는다.
2. 그러면 간선 제거를 간선 연결로 볼 수 있다. 그럼 엄청 쉬워진다
Union-Find를 통해 구현했고, 말 그대로 작은거를 큰거에 넣으면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import sys
input = sys.stdin.readline
p = [i for i in range(101010)]
def find(x):
if x == p[x]:
return x
p[x] = find(p[x])
return p[x]
def union(x, y): # 작은거 x 큰거 y
x = find(x)
y = find(y)
if len(c[y]) <= len(c[x]):
x, y = y, x
p[x] = y
for i in c[x]:
c[y].add(i)
c[x].clear()
n, qs = map(int, input().split())
g = [0 for _ in range(101010)]
c = [set() for _ in range(101010)]
for i in range(2, n + 1):
g[i] = int(input())
for i in range(1, n + 1):
c[i].add(int(input()))
q = []
for i in range(n + qs - 1):
a, b = map(int, input().split())
q.append((a, b))
ans = []
q.reverse()
for a, b in q:
if a == 1:
union(b, g[b])
else:
ans.append(len(c[find(b)]))
ans.reverse()
for i in ans:
print(i)
|
cs |
'백준 문제풀이' 카테고리의 다른 글
백준 10909 - Quaternion inverse [Python] (0) | 2021.05.31 |
---|---|
백준 21735 - 눈덩이 굴리기 [C++/Python] (0) | 2021.05.23 |
백준 14180 - 배열의 특징 [Python] (0) | 2021.05.09 |
백준 2315 - 가로등 끄기 [Python] (0) | 2021.05.06 |
백준 11693 - n^m의 약수의 합 [Python] (0) | 2021.04.30 |