※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 28851번 문제인 Протокол <<Судного дня>>이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/28851
주어진 조건에 따라 1을 루트로 갖고 лондонского метро들을 에지로 갖는 트리의
위와 같은 이동을
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> G[200001];
vector<int> GG[200001];
int lv[200001];
int table[18][200001];
void tableinit() {
for (int k = 1; k < 18; k++) {
for (int i = 1; i <= N; i++) {
table[k][i] = table[k - 1][table[k - 1][i]];
}
}
}
int dfs(int cur) {
int ret = cur;
for (auto &nxt : G[cur]) {
if (lv[nxt]) continue;
lv[nxt] = lv[cur] + 1;
int tmp = dfs(nxt);
if (lv[tmp] < lv[ret]) ret = tmp;
}
for (auto &prv : GG[cur]) {
if (lv[prv] < lv[ret]) ret = prv;
}
table[0][cur] = ret;
return ret;
}
int Q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 1; i < N; i++) {
int x, y; cin >> x >> y;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
cin >> M;
while (M--) {
int x, y; cin >> x >> y;
GG[x].emplace_back(y);
}
lv[1] = 1;
dfs(1);
tableinit();
cin >> Q;
while (Q--) {
int x, K; cin >> x >> K;
for (int k = 0; k < 18; k++) {
if (K & 1) x = table[k][x];
K >>= 1;
}
cout << x << '\n';
}
}
'BOJ' 카테고리의 다른 글
[BOJ 11268 // C++] Bell Ringing (0) | 2024.07.13 |
---|---|
[BOJ 14595 // C++] 동방 프로젝트 (Large) (0) | 2024.07.12 |
[BOJ 11968 // C++] High Card Wins (2) | 2024.07.10 |
[BOJ 18866 // C++] 젊은 날의 생이여 (0) | 2024.07.09 |
[BOJ 11626 // C++] Physical Music (0) | 2024.07.08 |