-
[13306] 트리BOJ 2022. 7. 20. 12:56
https://www.acmicpc.net/problem/13306
13306번: 트리
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 트리의 정점의 개수와 질의의 개수를 나타내는 두 정수 N과 Q (1 ≤ N, Q ≤ 200,000)가 주어진다. 다음 N-1개의 줄의 i번째 줄에는 정점 i+1의 부
www.acmicpc.net
#include <bits/stdc++.h>using namespace std;class UF {public:vector<int> p;UF(int n) { p = vector<int>(n + 1, -1); }int find(int cur) {if (p[cur] < 0) return cur;return p[cur] = find(p[cur]);}#define union _unionvoid union(int A, int B) {A = find(A), B = find(B);if (A == B) return;if (p[A] < p[B])p[A] += p[B], p[B] = A;elsep[B] += p[A], p[A] = B;}};int n, Q;vector<int> v;typedef struct {int op, a, b;} qry;vector<qry> q;int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n >> Q;v.resize(n + 1);auto uf = UF(n);int i;v[1] = 1; // rootfor (i = 2; i <= n; i++) cin >> v[i];int S = n - 1 + Q;q.resize(S);for (i = 0; i < S; i++) {qry cur = {-1, -1, -1};cin >> cur.op;if (cur.op == 1)cin >> cur.a >> cur.b;else if (cur.op == 0)cin >> cur.a;q[i] = cur;}
stack<bool> ans;for (i = S - 1; i >= 0; i--) {qry cur = q[i];if (cur.op == 0)uf.union(cur.a, v[cur.a]);else if (cur.op == 1)ans.push((uf.find(cur.a) == uf.find(cur.b)));}while (!ans.empty()) {cout << (ans.top() ? "YES" : "NO") << '\n';ans.pop();}return 0;}
'BOJ' 카테고리의 다른 글
lazy 세그 - 비재귀 (0) 2022.07.26 [10999] 구간 합 구하기 2 (0) 2022.07.26 [1688] 지민이의 테러 (0) 2022.07.16 [14907] 프로젝트 스케줄링 (0) 2022.07.04 [2585] 경비행기 (0) 2022.06.23