Skip to main content

Heavy_Light_Decomposition

BOJ 5916 ๋†์žฅ ๊ด€๋ฆฌ

·160 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5916 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ์ •์  ์‚ฌ์ด ๊ฒฝ๋กœ์— 1์„ ๋”ํ•œ๋‹ค. ๋‘ ์ •์  ์‚ฌ์ด ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๋‚˜์ด๋ธŒํ•˜๊ฒŒ๋Š” $O(QN)$์ด๊ฒ ์ง€๋งŒ, HLD์™€ Lazy ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ $O(Qlog^2N)$์ •๋„์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; Tree tree(N); rep(i, 0, N-1){ int u, v; cin >> u >> v; tree.add_edge(u, v); } tree.build(); LazySegmentTree seg(N+1); while(M--){ char op; cin >> op; int u, v; cin >> u >> v; if(op == 'P'){ vector<pii> segs = tree.hld_path(u, v, false, false); for(auto [L, R]: segs) seg.update(L, R, 1); } else{ ll ans = 0; vector<pii> segs = tree.hld_path(u, v, false, false); for(auto [L, R]: segs) ans += seg.query(L, R); cout << ans << '\n'; } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ