Skip to main content

Algorithm

BOJ 34609 Secret Lilies and Roses

·960 words·5 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/34609 ๋ฒˆ์—ญ ๋ฌธ์ œ # $1$๋ฒˆ๋ถ€ํ„ฐ $n$๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ $n$์†ก์ด์˜ ๊ฝƒ์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ผ๋ ฌ๋กœ ๋†“์—ฌ ์žˆ๋‹ค. ๊ฐ ๊ฝƒ์€ ๋ฐฑํ•ฉ(lily) ๋˜๋Š” ์žฅ๋ฏธ(rose) ์ค‘ ํ•˜๋‚˜์ด๋‹ค. $0$ ์ด์ƒ $n$ ์ดํ•˜์˜ ์ •์ˆ˜ $j$์— ๋Œ€ํ•ด, $l_j$๋ฅผ ์™ผ์ชฝ $j$๊ฐœ์˜ ๊ฝƒ ์ค‘ ๋ฐฑํ•ฉ์˜ ์ˆ˜, $r_j$๋ฅผ ์˜ค๋ฅธ์ชฝ $n - j$๊ฐœ์˜ ๊ฝƒ ์ค‘ ์žฅ๋ฏธ์˜ ์ˆ˜๋ผ ํ•˜์ž.

BOJ 28359 ์ˆ˜์—ด์˜ ๊ฐ€์น˜

·197 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/28359 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ผ๋‹จ ๋ชจ๋‘ $P$์— ๋ชฐ์•„๋„ฃ๊ฑฐ๋‚˜, $Q$์— ๋ชฐ์•„๋„ฃ๊ฑฐ๋‚˜๋Š” ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ผ๋‹จ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์ •๋„๋Š” ์—ฌ์œ ๋กญ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋ชจ๋“  ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์ˆ˜๋Š” $P$์™€ $Q$์— ๋™์‹œ์— ์†ํ•˜๋Š”๋ฐ… ๋™์‹œ์— ์†ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€? ๋™์‹œ์— ์†ํ•œ ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ˆ˜์ผ ์ˆ˜๋Š” ์—†๋‹ค. ์–ด๋–ค ์ˆ˜์™€ ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•œ ๊ฐ’์ด ์ตœ๋Œ€์ธ ์ˆ˜๋ฅผ ๊ณจ๋ผ์„œ, ๋งจ ๋’ค๋กœ ๋ณด๋‚ด์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; map<int, int> mp; int ans = 0; rep(i, 0, N){ int x; cin >> x; mp[x]++; ans += x; } int mxIdx = -1, mxVal = -1; for(auto [k, v]: mp){ if(k*v > mxVal){ mxVal = k*v; mxIdx = k; } } ans += mxVal; vector<int> v1, v2; for(auto [k, v]: mp){ if(k < mxIdx) rep(i, 0, v) v1.push_back(k); else if(k > mxIdx) rep(i, 0, v) v2.push_back(k); } rrep(i, 0, v2.size()) v1.push_back(v2[i]); rep(i, 0, mp[mxIdx]) v1.push_back(mxIdx); cout << ans << '\n'; for(auto x: v1) cout << x << ' '; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1006 ์Šต๊ฒฉ์ž ์ดˆ๋ผ๊ธฐ

·539 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1006 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์œ ๋ช…ํ•œ ํ†ต๊ณก์˜ ๋ฒฝ ๋ฌธ์ œ ์ดˆ๋ผ๊ธฐ ๋ฌธ์ œ๊ฐ€ $2 \times N$์˜ ์›ํ˜•์ด๋ผ ์กฐ๊ธˆ ๊ณค๋ž€ํ•˜๋‹ค. ์‰ฌ์šด ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์ƒ๊ฐํ•˜์ž. $1 \times N$์˜ ์„ ํ˜•์ด๋ผ๋ฉด, ๊ณ„๋‹จ ์ˆ˜์ฒ˜๋Ÿผ DP๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. $2 \times N$์˜ ์„ ํ˜•์ด๋ผ๋„ DP๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‘์นธ ์ „์—์„œ ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ€๋กœ๋‘๊ฐœ / ์œ„์— ๊ฐ€๋กœ์™€ ์•„๋ž˜ ๋”ฐ๋กœ / ์•„๋ž˜ ๊ฐ€๋กœ์™€ ์œ„์— ๋”ฐ๋กœ ํ•œ์นธ ์ „์—์„œ ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์„ธ๋กœ / ์œ„์•„๋ž˜ ๋”ฐ๋กœ ์ด 5๊ฐ€์ง€ ๊ฒฝ์šฐ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ์›ํ˜•์ด๋ผ ์กฐ๊ธˆ ๊ณค๋ž€ํ•œ๋ฐ.. ๋ญ”๊ฐ€ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค. ์„ ํ˜•์œผ๋กœ ์ƒ๊ฐํ–ˆ์„๋•Œ ๋งจ ์™ผ์ชฝ์— ๋Œ€ํ•ด, ๊ทธ๊ฒŒ ๋ฐ˜๋Œ€์ชฝ๊ณผ ์ด์–ด์ง„๊ฒฝ์šฐ / ์•ˆ์ด์–ด์ง„๊ฒฝ์šฐ. ์œ„์•„๋ž˜๋‹ˆ๊นŒ ๊ฐ๊ฐ ๋‘๊ฐ€์ง€, ์ด 4๊ฐ€์ง€ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋”ฐ์ง€๋ฉด ๋ ๋“ฏ? ๊ทผ๋ฐ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์ง€? ํฐ์ผ๋‚ฌ๋‹ค. ๋‘˜๋‹ค ๋ฐ˜๋Œ€์ชฝ๊ณผ ์ด์–ด์ง„ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ œ๋ฅผ ํ•œ์นธ ๋ฐ€์–ด์„œ ํ’€๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ํ•œ์ชฝ๋งŒ ๋ฐ€๋ฆฐ ๊ฒฝ์šฐ๊ฐ€ ๊นŒ๋‹ค๋กญ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ๋ชจ๋“  ์นธ์ด ์ง€๊ทธ์žฌ๊ทธ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๋นผ๊ณ ๋Š” ์–ธ์  ๊ฐ€๋Š” ์„ ํ˜•์œผ๋กœ ํ’€์–ด๋„ ๋˜๋Š” ํƒ€์ด๋ฐ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ์œ„์—์„œ ๋งํ•œ ํƒ€์ด๋ฐ์€ ์˜ˆ์ œ์—์„œ๋Š” $1-2, 10-11, 3-4, \cdots$๋กœ ์—ฐ๊ฒฐ๋œ ๋А๋‚Œ๊ณผ ๊ฐ™๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ $O(NW)$์ด ๋˜๊ธด ํ•˜๋Š”๋ฐ, ๋Œ๋งŒํ•˜์ง€ ์•Š์„๊นŒ? ์ € ์ง€๊ทธ์žฌ๊ทธ๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ฒ„๋ฆฌ์ž. ใ„ฒใ…‚ ์‹œ๊ฐ„์ดˆ๊ณผ๋„ค. ํ…Œ์ผ€๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค. ์—ฅ? ์ด๊ฑฐ ๊ทธ๋ƒฅ ๊ธธ์ด๋ฅผ $2N$์œผ๋กœ ๋Š˜๋ ค์„œ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? …์ธ์ค„์•Œ์•˜๋Š”๋ฐ ์ „์ด์‹ ์ž์ฒด๋ถ€ํ„ฐ ๋‘๊ฐœ ์ „์—์„œ ๋•ก๊ฒจ์˜ค๋‹ค๋ณด๋‹ˆ ์ฐจ๋ถ„ํŠธ๋ฆญ์ด ์•ˆ๋จนํžˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ์ „์ด์‹ ์ž์ฒด์—์„œ๋„ ์—ฌ๋Ÿฌ์นธ ๋‹จ์œ„๋กœ ์ง€๊ทธ์žฌ๊ทธ๋กœ ์˜ค๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์—†๋‹ค.. DP์—์„œ, ์ƒํƒœ๊ณต๊ฐ„์„ ์กฐ๊ธˆ ๋” ์ •์˜ํ•ด๋ณด์ž. $\text{DP}[i][j]$๋ผ๊ณ  ํ•˜๋ฉด, i๋ฒˆ์งธ์นธ๊นŒ์ง€ ๋ดค์„๋•Œ ์œ„์•„๋ž˜ ์ฐฌ๊ฒŒ j์ƒํ™ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. $j = 0, 1, 2, 3$์—์„œ ์œ„์•„๋ž˜ ๋ชจ๋‘ ๋น”, ์œ„ ์ฐธ, ์•„๋ž˜ ์ฐธ, ์œ„์•„๋ž˜ ๋ชจ๋‘ ์ฐธ๊ณผ ๊ฐ™์€ ๋А๋‚Œ์ด๋‹ค. ์ด๋ ‡๊ฒŒํ•ด์„œ ์ „์ด์‹์„ ์ž˜ ์„ธ์šฐ๋ฉด ์ € ์˜ˆ์™ธ์ƒํ™ฉ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•  ๊ฒƒ ๊ฐ™๋‹ค. 3๋ฒˆ์€ 0๋ฒˆ๊ณผ ๊ฐ™์œผ๋‹ˆ ์—†์• ๊ณ , ๋‚˜๋จธ์ง€ 3๊ฐœ๋กœ ์ •๋ง ์ž˜ ์ฒ˜๋ฆฌํ•ด๋ณด์ž… ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ ll N, W; cin >> N >> W; vector<array<ll, 2>> v(N); rep(i, 0, N) cin >> v[i][0]; rep(i, 0, N) cin >> v[i][1]; auto calc = [&](bool con1, bool con2) { vector<array<ll, 3>> DP(N+1); // 0: ๋‘˜๋‹ค๋, 1: ์œ„๊ฐ€ ํŠ€์–ด๋‚˜๊ฐ, 2: ์•„๋ž˜๊ฐ€ ํŠ€์–ด๋‚˜๊ฐ rep(i, 0, N+1) rep(j, 0, 3) DP[i][j] = 1e18; DP[0][0] = 0; if(con1) DP[0][1] = 0; if(con2) DP[0][2] = 0; if(con1 && con2) DP[1][0] = 0; rep(i, 1, N+1){ DP[i][0] = min(DP[i][0], DP[i-1][0] + (v[i-1][0] + v[i-1][1] <= W ? 1 : 2)); DP[i][0] = min(DP[i][0], DP[i-1][1] + 1); DP[i][0] = min(DP[i][0], DP[i-1][2] + 1); if(i-2 >= 0 && v[i-2][0]+v[i-1][0] <= W && v[i-2][1]+v[i-1][1] <= W){ DP[i][0] = min(DP[i][0], DP[i-2][0] + 2); } DP[i][1] = min(DP[i][1], DP[i][0] + 1); if((i == N && con1) || (i < N && v[i-1][0] + v[i][0] <= W)){ DP[i][1] = min(DP[i][1], DP[i-1][0] + 2); DP[i][1] = min(DP[i][1], DP[i-1][2] + 1); } DP[i][2] = min(DP[i][2], DP[i][0] + 1); if((i == N && con2) || (i < N && v[i-1][1] + v[i][1] <= W)){ DP[i][2] = min(DP[i][2], DP[i-1][0] + 2); DP[i][2] = min(DP[i][2], DP[i-1][1] + 1); } } if(!con1 && !con2) return DP[N][0]; if(con1 && !con2) return DP[N-1][2] + 1; if(!con1 && con2) return DP[N-1][1] + 1; if(con1 && con2) return DP[N-1][0] + 2; }; auto origin = v; ll ans = 2*N; rep(con1, 0, 2) rep(con2, 0, 2){ if(con1 && v[0][0] + v[N-1][0] > W) continue; if(con2 && v[0][1] + v[N-1][1] > W) continue; ans = min(ans, calc(con1, con2)); } cout << ans << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

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'; } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 16964 DFS ์ŠคํŽ˜์…œ ์ €์ง€

·122 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/16964 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # dfs๋ฅผ ๋Œ๋ฆฌ๋“ฏ์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฑธ์–ด์˜จ ๊ณผ์ •๋“ค์„ ๊ธฐ๋กํ•˜๋ฉด์„œ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋Š”๊ฐ€?๋ฅผ ์ฒดํฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): import sys input = sys.stdin.readline N = int(input()) links = [set() for _ in range(N + 1)] for _ in range(N-1): a, b = map(int, input().split()) links[a].add(b) links[b].add(a) lst = list(map(int, input().split())) if lst[0] != 1: print(0) exit() nidx = 1 stk = [1] while nidx < N: if not stk: print(0) exit() cur = stk[-1] if lst[nidx] in links[cur]: stk.append(lst[nidx]) nidx += 1 else: stk.pop() print(1) ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 16940 BFS ์ŠคํŽ˜์…œ ์ €์ง€

·290 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/16940 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ํ’€์ด1 ๋ฌธ์ œ ๊ทธ๋Œ€๋กœ ํ์— ๋„ฃ์œผ๋ฉด์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ๊ฐ™์€ ๋ ˆ๋ฒจ ์•ˆ์—์„œ ์›ํ•˜๋Š”๋Œ€๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋‹ค์Œ์œผ๋กœ ๋“ค๋ ค์•ผํ•˜๋Š”๊ฑธ ์…‹์œผ๋กœ ์ž˜ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ํ•ด๋ณด์ž. ํ’€์ด2 ํ˜„์žฌ ๋‚ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋…ธ๋“œ ๋‘๊ฐ€์ง€๋กœ ๋ฌธ์ œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์ž. cidx์—์„œ nidx๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด nidx++๋ฅผ ํ•˜๊ณ , ์—†์„๋•Œ cidx๋ฅผ ++ํ•˜์ž. nidx๊ฐ€ N์— ๋‹ฟ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. ์ด ํ’€์ด๋Š” ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ทธ๋ž˜ํ”„์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<vector<int>> links(N+1); rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } vector<int> order(N); bitset<100001> visited; rep(i, 0, N) cin >> order[i]; queue<set<int>> v; v.push({1}); visited[1] = true; int idx = 0; while(idx < N){ set<int> nset; while(!v.empty() && v.front().empty()) v.pop(); if(v.empty()){ cout << 0; return; } if(v.front().count(order[idx]) == 0){ cout << 0; return; } int cur = order[idx]; v.front().erase(cur); for(int nxt: links[cur]){ if(visited[nxt]) continue; visited[nxt] = true; nset.insert(nxt); } v.push(nset); idx++; } cout << 1; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 35288 Designant.

·473 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/35288 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌธ์ œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ„์„ ์„ $K$๊ฐœ ์ง€์›Œ์„œ ํฌ๋ ˆ์ŠคํŠธ๋กœ ๋งŒ๋“ ๋‹ค. ํฌ๋ ˆ์ŠคํŠธ๋ฅผ ์ž˜ ํ•ฉ์ณ์„œ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ํ•˜์ž. ํฌ๋ ˆ์ŠคํŠธ๋ฅผ ์ž˜ ํ•ฉ์น˜๋Š” ๋ฌธ์ œ๋Š” ๋นŒ๋ผ๋ด‰์œผ๋กœ ์œ ๋ช…ํ•˜๋‹ค. ์ด ๋ฌธ์ œ์— ๋”ฐ๋ฅด๋ฉด, ์„ธ๊ฐœ ์ด์ƒ์˜ ํŠธ๋ฆฌ๋ฅผ ํ•ฉ์น  ๋•Œ, ๊ฐ€์žฅ ๊ธด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ์„ธ๊ฐœ๋ฅผ $a \geq b \geq c$ ๋ผ๊ณ  ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” $\max(a, \lceil\frac{a}{2}\rceil + \lceil\frac{b}{2}\rceil + 1, \lceil\frac{b}{2}\rceil + \lceil\frac{c}{2}\rceil + 2)$ ๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™๊ณ , ์ด๋Š” ์ƒˆ๋กœ ๋งŒ๋“  ๊ฐ„์„ ์„ $0, 1, 2$๊ฐœ ์ด์šฉํ•˜๋Š” ๊ฒฝ๋กœ์ค‘ ๊ฐ€์žฅ ๊ธด๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๊ฐ€์žฅ ๊ธด ์ง€๋ฆ„์˜ ์ค‘์‹ฌ์— ๋‹ค๋ฅธ ์ค‘์‹ฌ๋“ค์„ ์ด์€ ๋ชจ์–‘์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํŠธ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ชผ๊ฐœ์„œ ์ง€๋ฆ„๋งŒ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์˜ˆ์ œ 1๋ฒˆ์˜ ํŠธ๋ฆฌ๋ฅผ ETT๋ฅผ ํ•˜๋ฉด์„œ ๊ทธ๋ ค๋ณด์ž. ![[Drawing 2026-02-25 22.49.23.excalidraw.png]] ๊ทธ๋ฆฌ๊ณ  ์„ธ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. $(1, 2), (3, 6), (4, 5, 7)$์œผ๋กœ ๋‚˜๋‰˜์–ด์•ผ ํ•˜๋Š”๋””… ETT๋กœ ์ƒ๊ฐํ•˜๋ฉด, $(1, 2, (5, (3, 6), 4, 7))$ ๊ฐ™์€ ๋А๋‚Œ์œผ๋กœ ๊ทธ๋ฃน์ง€์–ด์ง€๋Š”๊ฑด๊ฐ€? ์ž˜ ์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„๋“ค์€ ์ƒ๊ด€ ์—†๋Š”๋ฐ, $(5, 4, 7)$๊ฐ™์€๋ฐ์„œ ์ง€๋ฆ„์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ•˜๋ฉด ์ข‹์„์ง€ ๊ฐ์ด ์•ˆ์˜จ๋‹ค. ์ผ๋‹จ ์ €๊ฑธ $(5), (4,7)$ ๋‘ ๋ฉ์–ด๋ฆฌ๋ฅผ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ ๋ณด์ž. ์˜ค์ผ๋Ÿฌ ํˆฌ์–ด ํ…Œํฌ๋‹‰์„ ์ ์šฉํ•˜๋ฉด ์—ฐ์† ๊ตฌ๊ฐ„์— ์†ํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ์ง€๋ฆ„์€ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑฐ์ง€? ํŠธ๋ฆฌ ๋‘๊ฐœ์˜ ์ง€๋ฆ„์˜ ์–‘๋ ์ ์„ ๊ฐ๊ฐ $(a, b), (c, d)$ ๋ผ๊ณ  ํ• ๋•Œ ๋‘ ํŠธ๋ฆฌ๋ฅผ ํ•ฉ์นœ๊ณณ์—์„œ์˜ ์ง€๋ฆ„์€ $(a, b), (a, c), (a, d), (b, c), (b, d), (c, d)$์ค‘์—์„œ ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ pull์—ฐ์‚ฐ์œผ๋กœ ์ž˜ ์ •์˜ํ•ด๋ณด์ž. ๊ตฌํ˜„์ด ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค.. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, Q; cin >> N >> Q; vector<vector<int>> links(N+1); vector<pii> edges; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); edges.push_back({u, v}); } auto [ETT_in, ETT_out] = ETT(N, links); vector<int> ETT_inv(N+1); rep(i, 1, N+1) ETT_inv[ETT_in[i]] = i; LCA_Tree = new Tree_LCA(N+1, links); vector<Node> nodes(N+1); rep(i, 1, N+1) nodes[i] = Node(ETT_inv[i], ETT_inv[i], 0); SegmentTreeNode seg(N+1, nodes); vector<int> edge_to_subtree(N-1); rep(i, 0, N-1){ auto [u, v] = edges[i]; if(LCA_Tree->depth[u] < LCA_Tree->depth[v]) swap(u, v); edge_to_subtree[i] = u; } while(Q--){ int K; cin >> K; vector<int> cuts(K); rep(i, 0, K) cin >> cuts[i]; vector<Node> Query_nodes; vector<pair<int, bool>> events; // {ETT_idx, is_end} for(auto c: cuts){ int u = edge_to_subtree[c-1]; events.push_back({ETT_in[u], false}); events.push_back({ETT_out[u], true}); } sort(all(events)); int cur = 1; stack<Node> stk; stk.push(Node()); for(auto [idx, is_end]: events){ if(is_end){ Node& top = stk.top(); top = seg.pull(top, seg.query(cur, idx)); cur = idx+1; Query_nodes.push_back(top); stk.pop(); } else{ Node& top = stk.top(); top = seg.pull(top, seg.query(cur, idx-1)); cur = idx; stk.push(Node()); } } Node& top = stk.top(); top = seg.pull(top, seg.query(cur, N)); Query_nodes.push_back(top); sort(all(Query_nodes), [](Node a, Node b){ return a.dist > b.dist; }); int ans = 0; if(Query_nodes.size() > 0) ans = Query_nodes[0].dist; if(Query_nodes.size() > 1) ans = max(ans, (Query_nodes[0].dist+1)/2 + (Query_nodes[1].dist+1)/2 + 1); if(Query_nodes.size() > 2) ans = max(ans, (Query_nodes[1].dist+1)/2 + (Query_nodes[2].dist+1)/2 + 2); cout << ans << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

SOS Dynamic Programming

·392 words·2 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # $2^N$๊ฐœ์˜ ์ •์ˆ˜ ๋ฐฐ์—ด $A$๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ $\forall x$ ์— ๋Œ€ํ•ด $F(x)$๋ฅผ $\sum\limits_{i \subseteq x}{A[i]}$ ๋ผ๊ณ  ์ •์˜ํ•˜์ž. ์ด๋Š” $x\&i = i$ ์ธ $i$๋“ค์— ๋Œ€ํ•ด $A[i]$์˜ ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€ ์ˆ˜์žˆ์„๊นŒ? ๋ธŒ๋ฃจํŠธํฌ์Šค # ๋А๋ฆฌ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. for(int mask = 0; mask < (1<<N); mask++){ for(int i = 0; i < (1<<N); i++){ if((mask&i) == i){ F[mask] += A[i]; } } } ์œ„ ์‹์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด ๊ฒƒ์— ๊ฐ€๊น๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ${(2^N)}^2 = 4^N$์ด๋‹ค. ์กฐ๊ธˆ ๋” ๋‚˜์€ ํ’€์ด # ๋‘๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์— ๋Œ€ํ•ด, ๋ฐ”๊นฅ์ชฝ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ผœ์ง€์ง€ ์•Š์€ ๋น„ํŠธ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ˜๋ณต์„ ๋„๋Š”๊ฒƒ์€ ๋„ˆ๋ฌด ์•„๊น๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด๋„ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. for(int mask = 0; mask < (1<<N); mask++){ F[mask] = A[0]; for(int i = 0; i < (1<<N); i = (i-1)&mask) F[mask] += A[i]; } ์‹œ๊ฐ„๋ณต์žก๋„ ์ฆ๋ช…์ด ์–ด๋ ค์›Œ๋ณด์ธ๋‹ค. ์ด๋Š” $\sum\limits_{k = 0}^N{\binom{N}{K}2^K} = 3^N$ ์ด๋ผ๊ณ  ํ•œ๋‹ค. Sum over Subsets DP # ์œ„์˜ ๋ฐฉ์‹์—์„œ ๋ณ‘๋ชฉ์€ ์–ด๋””์—์„œ ๋‚˜ํƒ€๋‚ ๊นŒ? ์–ด๋–ค $x$์˜ ๋น„ํŠธ๊ฐ€ $K$๊ฐœ๊ฐ€ ๊บผ์ ธ์žˆ์„ ๋•Œ, $A[x]$๋Š” $2^K$๊ฐœ์˜ ๋งˆ์Šคํฌ์— ์˜ํ•ด ๋ฐฉ๋ฌธ๋œ๋‹ค. ์ด ๋ฐ˜๋ณต์ ์ธ ์žฌ๊ณ„์‚ฐ์„ ์ค„์—ฌ์•ผํ•œ๋‹ค. S(mask, i) ์ •์˜ # ์œ„ ๋ณ‘๋ชฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜ ์ •์˜ํ•ด๋ณด์ž. $S(mask, i)$๋Š” $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ๋“ค ์ค‘, $mask$์™€ ํ•˜์œ„(์˜ค๋ฅธ์ชฝ) $i$๊ฐœ ๋น„ํŠธ(0~i-1๋ฒˆ ์ธ๋ฑ์Šค)์—์„œ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, $S(110, 2) = \{100, 110\}$์ด๋‹ค. ์˜ค๋ฅธ์ชฝ ๋‘๊ฐœ ๋น„ํŠธ์—์„œ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ $111$๊ฐ™์€๊ฑด ์•ˆ๋œ๋‹ค. ์ด ์ •์˜๋ฅผ ์ด์šฉํ•˜๋ฉด, ์–ด๋–ค ์ง‘ํ•ฉ๋„ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋Š” $S(mask, i)$๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ ํ™”์‹ ์œ ๋„ # ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘๊ฐ€์ง€๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. $mask$์˜ $i$๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ $0$์ธ ๊ฒฝ์šฐ $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด $i$๋ฒˆ์งธ ๋น„ํŠธ์—์„œ $0$๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ $S(mask, i) = S(mask, i-1)$ $mask$์˜ $i$๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ $1$์ธ ๊ฒฝ์šฐ $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด $i$๋ฒˆ์งธ ๋น„ํŠธ์—์„œ $0, 1$ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ $S(mask, i) = S(mask, i-1) \cup S(mask \oplus 2^i, i-1)$ ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. for(int mask = 0; mask < (1<<N); mask++) DP[mask] = A[mask]; for(int i = 0; i<N; i++){ for(int mask = 0; mask < (1<<N); mask++){ if(mask & (1<<i)) DP[mask] += DP[mask ^ (1<<i)]; } } ๊ณ„์‚ฐ ๊ฒฐ๊ณผ DP์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์€ ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํ‚น์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์ด๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ทธ๋Œ€๋กœ ๋ณด์ด๋“ฏ์ด $O(N2^N)$์ด๋‹ค. N์ฐจ์› ๋ˆ„์ ํ•ฉ # https://blog.queuedlab.com/posts/sos-dp ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด, ์ด๋ฅผ $N$์ฐจ์› ๋ˆ„์ ํ•ฉ์œผ๋กœ๋„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ดํผ ์ˆ˜์—ด๊ณผ ํ•˜์ดํผ ์ฟผ๋ฆฌ ๋ฌธ์ œ์—์„œ $N$์ฐจ์› ๋ˆ„์ ํ•ฉ ์•„์ด๋””์–ด๋Š” ์จ๋ณธ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด SOS DP์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด ์‹ ๊ธฐํ•˜๋‹ค. ์•ž์œผ๋กœ๋Š” ํฌํ•จ๋ฐฐ์ œ์—์„œ ๋ญ”๊ฐ€ ์ค„์ด๊ณ ์‹ถ์œผ๋ฉด ํ•œ๋ฒˆ์”ฉ์€ ์˜์‹ฌํ•ด๋ณด๋Š”๊ฑธ๋กœ? imos-hanbyul Trick # ์ด์™€ ๋น„์Šทํ•œ ๋‚ด์šฉ์„ https://qwerasdfzxcl.tistory.com/35 ์—ฌ๊ธฐ์„œ ๋ณธ์ ์ด ์žˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ์€ ์ดํ•ดํ•˜๊ธฐ ๊ท€์ฐฎ์œผ๋ฏ€๋กœ ์ดํ•ดํ•œ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ # https://codeforces.com/blog/entry/45223 https://blog.queuedlab.com/posts/sos-dp https://qwerasdfzxcl.tistory.com/35

BOJ 2803 ๋‚ด๊ฐ€ ์–ด๋ ธ์„ ๋•Œ ๊ฐ€์ง€๊ณ  ๋†€๋˜ ์žฅ๋‚œ๊ฐ

·401 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/2803 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋น„ํŠธ๋งˆ์Šคํ‚น์ ์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด๋ฉด, ์—ฌ๋Ÿฌ ์žฅ๋‚œ๊ฐ ์ƒ์ž๋“ค์˜ or ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ $1111111..$์ด ๋˜๋„๋ก ํ•˜๋Š” ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. $N$์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธด ๊นŒ๋‹ค๋กœ์šฐ๋ฏ€๋กœ, $M \leq 20$์ธ ๊ฒƒ์„ ์ด์šฉํ•ด์„œ $M$์— ๋Œ€ํ•œ ๋น„ํŠธ๋งˆ์Šคํ‚น๋œ ์ƒ์ž์˜ ์ˆ˜๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ์ดํ›„ ๊ณผ์ •์„ ํฌํ•จ๋ฐฐ์ œ๋กœ ์ง„ํ–‰ํ•˜๋ฉด $O(2^N \times 2^N)$์ด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” SOS DP๋ฅผ ์ด์šฉํ•ด์„œ $O(N2^N)$ ์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ ์ธ SOS DP๋ž‘์€ ์„ธํŒ…์ด ์กฐ๊ธˆ ๋‹ค๋ฅธ๊ฐ€? ๊ณ ๋ฏผํ•ด๋ณด์ž. ๊ธฐ๋ณธ์ ์ธ SOS DP๋Š” ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํฌ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์›์†Œ ๊ฐœ์ˆ˜์˜ ํ•ฉ์ด๋‹ค. ์ด๋ฒˆ์— ๊ตฌํ•ด์•ผํ•˜๋Š”๊ฑด ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜์ธ๋ฐ.. ๊ฒฐ๊ตญ ์–ด๋–ค ์ƒ์ž $110011$์„ ๊ณจ๋ž๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด, $??11??$ ์ธ๊ฑธ ๋ชจ๋‘ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค. ์ด๊ฑธ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์„ธ๊ธด ํž˜๋“ค์ง€๋งŒ, ๋’ค์ง‘์–ด์„œ ์ƒ๊ฐํ•œ๋‹ค๋ฉด $??00??$์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , ์ด๊ฑด $110011$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ ๊ฐ™๋‹ค! ์ž๊ธฐ ์ž์‹ ์„ ์„ธ์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ์ € ๋ฐฉ๋ฒ•์œผ๋กœ ์„ธ๋ฉด, ๋‘๊ฐœ์˜ or์—ฐ์‚ฐ๋ฐ–์— ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ๋‹ค… 3๊ฐœ ์ด์ƒ์ธ๊ฑธ ๊ณ ๋ คํ•˜๋ ค๋ฉด DP ์„ค๊ณ„๋ฅผ ์กฐ๊ธˆ ๋” ์ž˜ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์•„ํ•˜, ์›๋ž˜๊ฒŒ $??11??$์ธ ๊ฐœ์ˆ˜๋ฅผ ์•ˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์—์„œ ํ•œ๊ฐœ ์ด์ƒ๋งŒ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค. ๊ทธ ๊ฐœ์ˆ˜๋ฅผ $\text{cnt}$๋ผ๊ณ  ํ•˜๋ฉด, $2^{\text{cnt}} - 1$์ด ์„ฑ๋ฆฝํ•˜๋Š”๊ฑฐ ๊ฐ™๊ธฐ๋„? ๊ทผ๋ฐ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ๋ญ๋ž„๊นŒ ์›๋ž˜๊ฐ€ $??10??$$ ์ธ๊ฑฐ๋ž‘ $??01??$$ ์ธ๊ฑฐ๋ž‘์ด ํ•ฉ์ณ์ ธ์„œ ๋˜๋Š”๊ฒƒ๋“ค์„ ๋ชป์„ธ๋Š”๊ฑฐ..๊ฐ™๊ธฐ๋„? ์—ฐ์‚ฐํ•ด์„œ $11$์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„ , $(11 + 10 + 01 + 00)^2$ ๊ฐ™์€ ๋А๋‚Œ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ์ € ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” $$ 11^2 + 10^2 + 01^2 + 00^2 + \\ 2(11\cdot10 + 11\cdot01 + 11\cdot00 + 10\cdot01 + 10\cdot00 + 01\cdot00) $$ ์ด๊ณ , ์ž˜ ๊ณ ๋ฏผํ•ด๋ณด๋‹ˆ $11$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ - $11, 01$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ - $00$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ์„ ํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ $11^2 + 2(11\times10 + 11\times01 + 11\times00 + 10\times01)$์ด ๋œ๋‹ค. ์•„๋‹ˆ ์ž ๊น๋งŒ, ์ € ๋А๋‚Œ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด ๊ทธ๋ƒฅ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์œผ๋กœ SOS DP๋ฅผ ํ•œ๋‹ค์Œ์— ํฌํ•จ๋ฐฐ์ œ๋ฅผ ๋•Œ๋ ค๋ฒ„๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ๋“  ๋œ๋‹ค. ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ $11...11$์ธ๋†ˆ๋“ค - $(01...11), (10..111)...$ + $...$ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<int> A(N); rep(i, 0, N){ int K; cin >> K; int ret = 0; rep(j, 0, K){ int x; cin >> x; ret |= (1 << (x-1)); } A[i] = ret; } vector<int> SOS(1 << M, 0); for(auto x: A) SOS[x] += 1; rep(i, 0, M) rep(mask, 0, 1<<M) if(mask & (1 << i)) SOS[mask] += SOS[mask^(1<<i)]; mint ans = 0; rep(mask, 0, 1<<M){ int cnt = 0; rep(i, 0, M) if((mask & (1 << i)) == 0) cnt++; if(cnt & 1) ans -= (mint(2).pow(SOS[mask])); else ans += (mint(2).pow(SOS[mask])); } cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 17364 ๋Œ€ํšŒ

·389 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/17364 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์–ด… ๋ฌธ์ œ๊ฐ€ ์ƒ๋‹นํžˆ ๊ณค๋ž€ํ•ด๋ณด์ธ๋‹ค. ใ…‹ใ…‹ใ…‹ใ…‹ ์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ๋ถ€ํ„ฐ ์นœ์ ˆํ•ด์„œ ๋ง์ •์ด์ง€, ์ €๋Ÿฐ๊ฑฐ ์—†์—ˆ์œผ๋ฉด ๋‹น์—ฐํžˆ 1357๋ฒˆ 1๋“ฑํ•œํ…Œ ๋จน์ด๊ณ  3 ์ถœ๋ ฅํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. $K = 1$์ผ๋•Œ๋ถ€ํ„ฐ ํ’€์–ด๋ณด์ž. ์ด๋•Œ๋Š” ์ž๋ช…ํ•˜๊ฒŒ๋„ ํšŒ์˜์‹ค ๋ฐฐ์ • ๋ฌธ์ œ์™€ ๊ฐ™๋‹ค. ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€์ž. $K = 2$๋ผ๋ฉด? ํ˜•์„ญ์ด๋Š” 1๋“ฑ์ด ๋จน๊ณ  ๋‚จ์€ ๋Œ€ํšŒ๋“ค์— ๋Œ€ํ•ด์„œ, ๊ฒฐ๊ตญ ์œ„์˜ ๊ทธ๋ฆฌ๋””ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ ธ๊ฐˆ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ, 1๋“ฑ์ด 1, 3, 5, 7๋ฒˆ ๋Œ€ํšŒ๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ๋‚จ์€ ๋Œ€ํšŒ๊ฐ€ $(2, 3), (4, 5), (6, 7)$ ์ด๋ผ๋ฉด 3๊ฐœ๋ฅผ ๋จน๋Š” ๊ฒƒ์ด๊ณ , 1, 4, 7๋ฒˆ์งธ ๋Œ€ํšŒ๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ๋‚จ์€ ๋Œ€ํšŒ๊ฐ€ $(2, 3), (3, 4), (5, 6), (6, 7)$ ์ด๋ผ๋ฉด 2๊ฐœ๋ฐ–์— ๋ชป๋จน๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฑธ DP๊ฐ™์€๊ฑธ๋กœ ์–ด๋–ป๊ฒŒ ์ž˜ ๊ฐ€์ ธ๊ฐ€๋ฉด ์ข‹์„๊ฒƒ๊ฐ™์€๋ฐ.. ์—ฅ? ๊ทผ๋ฐ ์ด๊ฑฐ ์•ฝ๊ฐ„ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋˜์ง€ ์•Š์„๊นŒ? ํ˜•์„ญ์”จ๋„ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋จน์œผ๋ ค๊ณ  ํ•˜๋‹ˆ, ํ˜•์„ญ์”จ์˜ ๊ทธ๋ฆฌ๋””๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ฐฉํ•ดํ•˜์ž. ์ œ์ผ์ฒ˜์Œ์— ์‹œ๊ฐ„์€ $T = 0$์ผ๋•Œ, ํ˜•์„ญ์”จ๋Š” ์ฒซ๋ฒˆ์งธ ๋Œ€ํšŒ $(1, 2)$๋ฅผ ์ถœ์ „ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ”์•„๋กœ 1๋“ฑ ์ถœ๋™ ํž์ž‰์ž‰๊ฑฐ๋ฆฌ๋ฉด์„œ ๋‘๋ฒˆ์งธ ๋Œ€ํšŒ $(2, 3)$์„ ์ถœ์ „ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๊ฑธ ๋ง‰์„์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑธ ๋‚˜๊ฐ€๊ณ  ๋‚˜๋ฉด $(3, 4)$ ๊นŒ์ง€๋Š” ๋ชป๋‚˜๊ฐ€์‹œ๋‹ˆ ์ ˆ๋Œ€ ์•ˆ๋ง‰์•„๋ฒ„๋ฆฌ๊ธฐ ๊ทธ๋‹ค์Œ์— $(4, 5)$ ๋Œ€ํšŒ๋ฅผ ๋‚˜๊ฐ€์‹œ๋ ค๊ณ ํ•˜๋ฉด, ์ด๋•Œ ์ฒซ๋ฒˆ์งธ ๋Œ€ํšŒ ๋‚˜๊ฐ€์‹ ๋ถ„์€ ํ‡ด๊ทผ ํ›„ ์ง‘์—์„œ ์š”์–‘์ค‘์ด์‹œ๋‹ค. ๋ฐ”๋กœ ์ €๊ธฐ ๋ณด๋‚ด๋ฒ„๋ฆฌ์ž. ๋‹ค์‹œ ํ˜•์„ญ์”จ๋Š” ํž์ž‰์ž‰๊ฑฐ๋ฆฌ๋ฉด์„œ.. ์–ด์ฉŒ๊ตฌ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค!!!!!!! ใ… .ใ…  ๋ฐ”๋กœ ํ‹€๋ ธ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ƒ๋Œ€๋ฐฉ์ด ๋„ˆ๋ฌด ๋งŽ์€ ๋Œ€ํšŒ๋ฅผ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋œ๋‹ค. ์•„ํ•˜, $(3, 5), (4, 5), (2, 7)$์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋‹จ์ˆœํ•˜๊ฒŒ ๋๋‚˜๋Š” ์‹œ๊ฐ„๋งŒ ๊ด€๋ฆฌํ•ด์„œ๋Š”, 5์ผ์— ๋‚˜์™€์„œ ํ‡ด๊ทผ ํ›„ ์ € $(2, 7)$ ๋Œ€ํšŒ์— ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด๊ฐ€ ํ•ด๋ฒ„๋ ธ๋‹ค. ์ด๋Ÿฌ๋ฉด ์•ˆ๋˜์ง€ ์Œ.. ์–ด์ฐจํ”ผ ์„ธ๊ฐœ ๋‹ค ๋ฌด์กฐ๊ฑด ๋ชป๋จน๋Š”๊ฑด ๋งž๋Š”๋ฐ. ๊ทธ๋ฆฌ๋””๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด.. ์“ธ ์ˆ˜ ์žˆ๋Š” ๋†ˆ์ค‘ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋๋‚˜๋Š” ๋†ˆ์„ ์“ฐ๋Š”๊ฒŒ ์œ ํšจํ•œ๊ฐ€? ๋‹ค์Œ $(s, e)$์—์„œ ์–ด์ฐจํ”ผ $e$๋Š” ๊ฝค ํฌ๊ณ , $s$๊ฐ€ ๋น ๋ฅธ ๋†ˆ์ด ๋“ค์–ด์˜ค๋Š”๊ฒŒ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์ž์œ ๋กœ์šด ์นœ๊ตฌ๊ฐ€ ๋” ์˜ค๋ž˜ ์‰ฌ๋„๋ก ํ•ด์•ผํ•˜๋Š”๊ฑฐ ๊ฐ™๋‹ค .๊ทธ๋Ÿฌ๋ฉด ๋งž๋Š”๊ฑฐ๊ฐ™๋‹ค!! ์…‹๊ฐ™์€๊ฑธ๋กœ ์ง€์ ์„ ์ž˜ ์ฐพ์•„๋ณด์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, K; cin >> N >> K; vector<pii> contests(N); rep(i, 0, N) cin >> contests[i].first >> contests[i].second; sort(all(contests), [](const pii &a, const pii &b){ if(a.second == b.second) return a.first < b.first; return a.second < b.second; }); int ans = 0; int T = 0; multiset<int> st; rep(i, 0, K-1) st.insert(0); for(auto &[a, b]: contests){ if(a <= T) continue; auto it = st.lower_bound(a); if(it == st.begin()){ ans++; T = b; continue; } it--; st.erase(it); st.insert(b); } cout << ans; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ