·340 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30690 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ํผ ํธ๋ฆฌ๊ฐ ์๋ค ๊ฐ์ ํ๋๋ฅผ ๋ผ๊ณ ๋ค์ ์ฐ๊ฒฐํด์, ๊ฐ์ฅ ๋ง์ ๊ฐ์ ์ ์ง๋๊ฐ๊ณ ์ถ๋ค. ๊ฐ์ ํ๋๋ฅผ ๋ผ๊ณ ๋ค์ ์ฐ๊ฒฐํด์, ํธ๋ฆฌ์ ์ง๋ฆ์ ์ต๋๋ก ํ๊ณ ์ถ๋ค. ์ชผ๊ฐ์ง ๋๊ฐ์ ํธ๋ฆฌ์์, ๊ฐ๊ฐ์ ์ง๋ฆ + 1์ด ๋ต์ด๋ค. ํธ๋ฆฌ๋ฅผ ์ฐ๋ ํธ๋ฆฌ ๋ฌธ์ ํด๋น ๋ฌธ์ ์์, ํด๋น ์๋ธํธ๋ฆฌ๋ฅผ ์ ์ธํ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ ์ ์์ผ๋ฉด ๋๋ ๊ฒ ๊ฐ๋ค. ์ด๋ ๋ฆฌ๋ฃจํ
๊ณผ ๋ถ๋ชจ๊น์ด, ๋ค๋ฅธ ์์์ ๊น์ด ๋๊ฐ์ ๋๋ฅผ ์ ๋ค๊ณ ์์ผ๋ฉด ๊ฐ๋ฅํ๊ฒ ๋ค. ๋ค๋ฅธ ์์์ ์ง๋ฆ๋ ๋ค๊ณ ์์ด์ผ ํ๋ค!! ์์ ํธ๋ฆฌ ๊ทธ๋ฆผ ![[Drawing 2026-01-26 17.35.39.excalidraw.png]] ๐ป ํ์ด # ์ฝ๋ (C++): int N, Q; vector<int> links[200010]; int depth[200010]; vector<pii> childs[200010]; // {mxDepth, nodeIdx} vector<pii> childs2[200010]; // {mxDiam, nodeIdx} int diam[200010], upDepth[200010], upDiam[200010]; void dfs1(int cur, int par){ vector<pii> ret; ret.push_back({0, cur}); for(auto nxt: links[cur]){ if(nxt == par) continue; depth[nxt] = depth[cur] + 1; dfs1(nxt, cur); diam[cur] = max(diam[cur], diam[nxt]); ret.push_back({childs[nxt][0].first + 1, nxt}); sort(all(ret), greater<pii>()); if((int)ret.size() > 3) ret.pop_back(); childs2[cur].push_back({diam[nxt], nxt}); sort(all(childs2[cur]), greater<pii>()); if((int)childs2[cur].size() > 2) childs2[cur].pop_back(); } childs[cur] = ret; if((int)ret.size() >= 2) diam[cur] = max(diam[cur], ret[0].first + ret[1].first); if((int)ret.size() >= 1) diam[cur] = max(diam[cur], ret[0].first); } void dfs2(int cur, int par, int mxUp){ for(auto nxt: links[cur]){ if(nxt == par) continue; vector<int> candidates; candidates.push_back(mxUp); for(auto [d, idx]: childs[cur]) if(idx != nxt) candidates.push_back(d); sort(all(candidates), greater<int>()); if((int)candidates.size() >= 2) upDiam[nxt] = max(upDiam[nxt], candidates[0] + candidates[1]); if((int)candidates.size() >= 1) upDiam[nxt] = max(upDiam[nxt], candidates[0]); for(auto [d, idx]: childs2[cur]) if(idx != nxt) upDiam[nxt] = max(upDiam[nxt], d); upDiam[nxt] = max(upDiam[nxt], upDiam[cur]); dfs2(nxt, cur, candidates[0] + 1); } } void solve(){ cin >> N >> Q; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } dfs1(1, -1); dfs2(1, -1, 0); // rep(i, 1, N+1) cout << diam[i] << " "; cout << "\n"; // rep(i, 1, N+1) cout << upDiam[i] << " "; cout << "\n"; while(Q--){ int u, v; cin >> u >> v; if(depth[u] < depth[v]) swap(u, v); cout << diam[u] + upDiam[u] + 1 << "\n"; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ