일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백트래킹
- 가끔은_말로
- 우선 순위 큐
- 플로이드 와샬
- NEXT
- 2023
- 알고리즘
- 자바스크립트
- 다익스트라
- 조합론
- 문자열
- back propagation
- 세그먼트 트리
- 이분 탐색
- DP
- dropout
- Overfitting
- object detection
- 너비 우선 탐색
- 크루스칼
- 회고록
- tensorflow
- dfs
- 미래는_현재와_과거로
- 분할 정복
- pytorch
- c++
- 가끔은 말로
- lazy propagation
- BFS
Archives
- Today
- Total
Doby's Lab
백준 13306번: 트리 (C++) 본문
https://www.acmicpc.net/problem/13306
Solved By: Offline Query, Union-Find
문제를 직관적으로 처리하려면 DFS를 하는데에 있어서 쿼리의 개수까지 고려하면 O(NQ)로 시간 초과가 나옵니다.
하지만, 쿼리를 우리에게 유리하게끔 쿼리 순서를 바꾸어 Offline Query로 처리하려 한다면 문제에서 '간선을 끊어라'는 '간선을 이어라'가 되면서 Union-Find 문제가 됩니다. -> O(QlogN)
그리고, 쿼리에서 간선을 끊는 쿼리는 총 N-1개가 주어진다 하였으므로 Offline Query의 관점에서 문제를 본다면 Edge 하나도 없는 그래프에서 Edge를 이어가며 두 노드 사이에 경로가 있는지만 확인하면 됩니다.
#include <iostream>
#include <vector>
#include <stack>
#define MAX 200001
using namespace std;
int N, Q;
int query[2 * MAX][3];
int parent[MAX];
int uf[MAX];
int getRoot(int node){
if(uf[node] < 0) return node;
else return uf[node] = getRoot(uf[node]);
}
void unionNodes(int a, int b){
int ga = getRoot(a);
int gb = getRoot(b);
if(ga < gb) uf[gb] = ga;
else uf[ga] = gb;
}
int main(){
cin >> N >> Q;
for(int i = 2; i < N + 1; i++){
cin >> parent[i];
}
Q += N - 1;
for(int i = 0; i < Q; i++){
cin >> query[i][0] >> query[i][1];
if(query[i][0] == 1) cin >> query[i][2];
}
// Query를 거꾸로 유리하게 처리 => Offline Query
stack<bool> res;
fill(uf, uf + MAX, -1);
for(int i = Q - 1; i >= 0; i--){
if(!query[i][0]) unionNodes(query[i][1], parent[query[i][1]]);
else{
int u = getRoot(query[i][1]), v = getRoot(query[i][2]);
res.push(u == v);
}
}
while(!res.empty()){
cout << (res.top() ? "YES" : "NO") << '\n';
res.pop();
}
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 12760번: 최후의 승자는 누구? (C++) (0) | 2022.09.17 |
---|---|
백준 1854번: K번째 최단경로 찾기 (C++) (1) | 2022.08.24 |
백준 1305번: 광고 (C++) (0) | 2022.08.10 |
백준 13706번: 제곱근 (Python) (0) | 2022.08.08 |
백준 14935번: FA (Python) (0) | 2022.08.08 |