일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- MCMF
- dinic
- 아호코라식
- 오블완
- LCA
- TRIE
- 세그먼트트리
- lcp
- SCC
- 유량
- 2-sat
- 임대차계약
- Seg
- 티스토리챌린지
- Segment tree
- 이분매칭
- 구현
- 트라이
- 접미사배열
- 좌표압축
- 트리dp
- 투룸
- 월세
- 디닉
- spfa
- 2SAT
- 전월세
- suffix array
- 이분탐색
- treedp
Archives
- Today
- Total
N coding
3176_도로네트워크 본문
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; #define inf 10000000 int n, a, b, c, k, d, e; int mx = 0, mn = inf; int par[100001][21], maxx[100001][21], minn[100001][21]; int visit[100001], dep[100001]; vector<vector<pair<int, int>>> adj; void dfs(int cur, int d) { visit[cur] = 1; dep[cur] = d; for (auto i : adj[cur]) { if (!visit[i.first]) { par[i.first][0] = cur; maxx[i.first][0] = i.second; minn[i.first][0] = i.second; dfs(i.first, d + 1); } } } void func(int n) { for (int j = 1; j < 21; j++) { for (int i = 1; i <= n; i++) { par[i][j] = par[par[i][j - 1]][j - 1]; if (maxx[par[i][j - 1]][j - 1]) { maxx[i][j] = max(maxx[i][j - 1], maxx[par[i][j - 1]][j - 1]); } if (minn[par[i][j - 1]][j - 1]) { minn[i][j] = min(minn[i][j - 1], minn[par[i][j - 1]][j - 1]); } } } } int largest(int a, int b, int c) { int ret = a; ret > b ? ret : ret = b; ret > c ? ret : ret = c; return ret; } int smallest(int a, int b, int c) { int ret = a; ret < b ? ret : ret = b; ret < c ? ret : ret = c; return ret; } void lca(int x, int y) { if (dep[x] > dep[y]) swap(x, y); for (int i = 20; i >= 0; i--) { if (dep[y] - dep[x] >= (1 << i)) { mx = max(mx, maxx[y][i]); mn = min(mn, minn[y][i]); y = par[y][i]; } } if (x == y) { return; } for (int i = 20; i >= 0; i--) { if (par[x][i] != par[y][i]) { mx = largest(mx, maxx[x][i], maxx[y][i]); mn = smallest(mn, minn[y][i], minn[x][i]); x = par[x][i]; y = par[y][i]; } } mx = largest(mx, maxx[x][0], maxx[y][0]); mn = smallest(mn, minn[y][0], minn[x][0]); } int main() { scanf("%d", &n); adj.resize(n + 1); for (int i = 0; i < n - 1; i++) { scanf("%d %d %d", &a, &b, &c); adj[a].push_back({ b, c }); adj[b].push_back({ a, c }); } dfs(1, 0); func(n); scanf("%d", &k); while (k--) { scanf("%d %d", &d, &e); mx = 0; mn = inf; lca(d, e); printf("%d %d\n", mn, mx); } } | cs |
딱 1년정도 전쯤에 풀었던 lca 문제이다.
이땐 이것도 길다고 찡찡댔는데 지금은..
'PS' 카테고리의 다른 글
5922_above the median (0) | 2020.06.26 |
---|---|
2472_체인점 (0) | 2018.09.22 |
5480_전함 (0) | 2018.09.21 |
[Atcoder] ARC 102D - All Your Paths are Different Lengths (2) | 2018.09.13 |
1575_졸업 (0) | 2018.09.07 |