Skip to main content

Algorithm

BOJ 5638 ์ˆ˜๋ฌธ

·209 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5638 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋Œ์— ์ˆ˜๋ฌธ์ด ์žˆ๊ณ , ์œ ๋Ÿ‰๊ณผ ํ”ผํ•ด๋น„์šฉ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํ”ผํ•ด๋น„์šฉ์€ ์—ฌ๋Š” ์‹œ๊ฐ„์— ๋น„๋ก€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ์ˆ˜๋ฌธ์— ๋Œ€ํ•ด, ์œ ๋Ÿ‰์— ์‹œ๊ฐ„์„ ๊ณฑํ•ด์„œ ๊ฐ ์ˆ˜๋ฌธ์ด ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ ๊ฐ€๊ฒฉ์ด ๋‚˜์˜จ๋‹ค. ์ด๊ฑด ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ๋Š” ์กฐ๊ธˆ ๊ณค๋ž€ํ•˜๊ณ , ๋ฐฐ๋‚ญ ๋ฌธ์ œ๋กœ ๋˜๋‚˜? ํ–ˆ๋Š”๋ฐ, $V$๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ์ˆ˜๋ฌธ์˜ ๊ฐœ์ˆ˜๊ฐ€ $n \leq 20$์œผ๋กœ ์œ ์˜๋ฏธํ•˜๊ฒŒ ์ž‘๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋ชจ๋“  ์ˆ˜๋ฌธ์„ ์—ด์–ด๋ณด๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„ $O(2^n \cdot nm)$ ์ •๋„์— ๋™์ž‘ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<pll> door(N); rep(i, 0, N) cin >> door[i].first >> door[i].second; int Q; cin >> Q; rep(q, 1, Q+1){ ll V, T; cin >> V >> T; ll ans = 1e18; rep(bit, 0, 1<<N){ ll wat = 0, cost = 0; rep(i, 0, N) if(bit & (1<<i)) wat += door[i].first*T, cost += door[i].second; if(wat >= V) ans = min(ans, cost); } cout << "Case " << q << ": "; if(ans == 1e18) cout << "IMPOSSIBLE\n"; else cout << ans << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1739 ๋„๋กœ ์ •๋น„ํ•˜๊ธฐ

·346 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1739 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $(1, 1) \rightarrow (6, 6)$์œผ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„  ์–ด๋•Œ์•ผ ํ•˜์ง€? $r_1, c_6$์ด ์˜ค๋ฅธ์ชฝ / ์•„๋ž˜์ด๊ฑฐ๋‚˜, $c_1, r_6$์ด ์•„๋ž˜ / ์˜ค๋ฅธ์ชฝ์ด๊ฑฐ๋‚˜.. ์˜ค๋ฅธ์ชฝ / ์•„๋ž˜๋ฅผ ์ฐธ, ์™ผ์ชฝ/์œ„๋ฅผ ๊ฑฐ์ง“์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด, $(r_1 \land c_6) \lor (r_6 \land c_1)$ ๊ฐ™์€ ๋А๋‚Œ์ธ๊ฐ€? ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์ž˜ ํ•˜๋ฉด 2-sat์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„๊ฒƒ๊ฐ™์€๋ฐ.. $r6$์ด ์•„๋‹ˆ๋ผ๋ฉด, $r1, c6$์ด ์ฐธ์ด์–ด์•ผํ•˜๊ณ , ์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ๋˜๋Š”๊ฒƒ๊ฐ™๋‹ค. $(\neg r_6 \rightarrow r_1) \land (\neg r_6 \rightarrow c_6)$ ์ด๋Ÿฐ๊ฑธ 4๊ฐœ์— ๋Œ€ํ•ด์„œ ํ•˜๋ฉด ๋ ๊ฑฐ๊ฐ™์€๋ฐ? $(r_1, c_1) \rightarrow (r_2, c_2)$ ๋ผ๊ณ  ํ•ด๋ณด์ž. ์ผ๋‹จ $r_1 < r_2, c_1 < c_2$๋ผ๊ณ  ํ•˜์ž. $(\neg r_1 \rightarrow r_2) \land (\neg r_1 \rightarrow c_1)$ $(\neg c_2 \rightarrow r_2) \land (\neg c_2 \rightarrow c_1)$ $(\neg r_2 \rightarrow r_1) \land (\neg r_2 \rightarrow c_2)$ $(\neg c_1 \rightarrow r_1) \land (\neg c_1 \rightarrow c_2)$ ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋ฉด $r_1 > r_2, c_1 > c_2$๋ผ๋ฉด? ๋˜‘๊ฐ™์ด $r_1, c_2$์˜ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜, $r_2, c_1$์˜ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•ด์•ผํ•˜๋Š”๊ฑด ๊ฐ™๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™ผ์ชฝ์ด๋ผ์„œ ์ฐธ์ด์–ด์•ผ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชฉ์ ์ง€๊ฐ€ ๊ฑฐ์ง“์ด์–ด์•ผ ํ•œ๋‹ค. $(\neg r_1 \land \neg c_2) \lor (\neg r_2 \land \neg c_1)$ ์ฒ˜๋Ÿผ ๋˜์–ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์•„ํ•˜, ๋Œ€์†Œ๊ด€๊ณ„๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ด๊ฒŒ ๋‚ซ์œผ๋กœ ๋ฐ”๋€๋‹ค. ์ด๊ฑธ ์ด์šฉํ•ด์„œ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„์ด ๋ ๋ผ๋‚˜? ๊ตฌํ˜„ ์‹ค์ˆ˜ํ•˜์ง€ ์•Š๊ฒŒ ์กฐ์‹ฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M, K; cin >> N >> M >> K; DirectedGraph tsat((N+M)*2); rep(i, 0, K){ int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2; r1--; c1--; r2--; c2--; r1 *= 2; r2 *= 2; c1 = (c1 + N) * 2; c2 = (c2 + N) * 2; if(r1 == r2 && c1 == c2) continue; if(r1 == r2){ if(c1 < c2) tsat.add_edge(r1^1, r1); else tsat.add_edge(r1, r1^1); continue; } if(c1 == c2){ if(r1 < r2) tsat.add_edge(c1^1, c1); else tsat.add_edge(c1, c1^1); continue; } if(c1 > c2) r1^=1, r2^=1; if(r1 > r2) c1^=1, c2^=1; tsat.add_edge(c1^1, r1); tsat.add_edge(c1^1, c2); tsat.add_edge(r2^1, r1); tsat.add_edge(r2^1, c2); tsat.add_edge(r1^1, r2); tsat.add_edge(r1^1, c1); tsat.add_edge(c2^1, r2); tsat.add_edge(c2^1, c1); } cout << (tsat.is2SAT() ? "Yes\n" : "No\n"); } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30880 ์ฟผ๋ฆฌ๋Š” ๋ฝ์ด ์•„๋‹ˆ๋‹ค

·406 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30880 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ˆ„๊ฐ€๋ด๋„ ์„ธ๊ทธ๋จผํŠธํŠธ๋ฆฌ ์„ธํŒ…์ธ๊ฒƒ๊ฐ™๋‹ค. ๊ธˆ๊ด‘๊ฐ™์€๊ฑฐ์ฃ  ๋…ธ๋“œ ์ •์˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ? ๋ถ€๋ถ„์—ด์ด๋‹ˆ๊นŒ, R / O / C / K ๊ฐœ์ˆ˜๋Š” ๋‹น์—ฐํžˆ ์žˆ์–ด์•ผํ•˜๊ณ .. ROCK ๊ฐœ์ˆ˜๋Š” ROCK๊ฐœ์ˆ˜ + ์™ผ์ชฝ R + ์˜ค๋ฅธ์ชฝ OCK, RO + CK, ROC + K,, ์•„ํ•˜, R / RO / ROC / ROCK / O / OC / OCK / C / CK / K ๋‹ค ์„ธ๋ฉด ๋˜๋‚˜? ์•„ ๊ทธ๋Ÿฐ๋ฐ, ROCK์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ROCK๋กœ ๋๋‚˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์•ผํ•œ๋‹ค๋Š”๊ฑด, ๊ธธ์ด๋„ ์–ด๋–ป๊ฒŒ ์ž˜ ๊ณฑํ•ด์•ผ๋˜๋Š”๊ฒƒ๊ฐ™์€๋ฐ $XRRX$ ์™€ $XOCK$ ๋ฅผ ํ•ฉ์นœ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๋‹ต์€ $XRROCK, XROCK, XROCK, RROCK, ROCK, ROCK$๋กœ 6๊ฐœ์ธ๊ฒƒ ๊ฐ™๋‹ค. ๋’ค์— $OCK$๊ทผ์ฒ˜์—์„œ๋Š” ๋ณ„ ๊ฐํฅ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™๊ณ , ์•ž์—์žˆ๋Š” $R$๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์ƒ๊ด€์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ์œ„์น˜๋“ค์— ๋Œ€ํ•ด, $2 + 4$ ํ•ด์„œ 6์ด ๋‚˜์˜จ ๊ฒƒ ๊ฐ™๋‹ค. ๋…ธ๋“œ ์•ˆ์—์„œ $R$์— ๋Œ€ํ•ด, $R$์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ $R$๋กœ ๋๋‚˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š”๊ฒŒ ์ข‹๊ฒ ๋‹ค. R, RO, ROC, ROCK์— ๋Œ€ํ•ด์„œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): struct Node{ mint R = 0, RO = 0, ROC = 0, ROCK = 0, O = 0, OC = 0, OCK = 0, C = 0, CK = 0, K = 0; mint len = 0; mint ans = 0; Node(){}; Node(char c){ if(c == 'R') R += 1; if(c == 'O') O += 1; if(c == 'C') C += 1; if(c == 'K') K += 1; len = 1; }; }; Node pull(Node a, Node b){ Node ret; ret.R = a.R + mint(2).pow(a.len.val)*b.R; ret.O = a.O + b.O; ret.C = a.C + b.C; ret.K = a.K + b.K; ret.RO = a.RO + mint(2).pow(a.len.val)*b.RO + a.R*b.O; ret.OC = a.OC + b.OC + a.O*b.C; ret.CK = a.CK + b.CK + a.C*b.K; ret.ROC = a.ROC + mint(2).pow(a.len.val)*b.ROC + a.RO*b.C + a.R*b.OC; ret.OCK = a.OCK + b.OCK + a.OC*b.K + a.O*b.CK; ret.ROCK = a.ROCK + mint(2).pow(a.len.val)*b.ROCK + a.ROC*b.K + a.RO*b.CK + a.R*b.OCK; ret.len = a.len + b.len; return ret; } void solve(){ int N; cin >> N; string S; cin >> S; vector<Node> v(N); rep(i, 0, N) v[i] = Node(S[i]); SegmentTreeNode ST(N, v); int Q; cin >> Q; while(Q--){ int op; cin >> op; if(op == 1){ int idx; cin >> idx; char c; cin >> c; ST.set(idx-1, Node(c)); } else{ int l, r; cin >> l >> r; l--; r--; cout << ST.query(l, r).ROCK << '\n'; } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30478 Candy Rush

·512 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30478 ๋ฌธ์ œ # ๋Ÿฌ์‹œ์•„์›Œ์ž…๋‹ˆ๋‹ค! ์˜ค๋Š˜ ํ‡ด๊ทผ ํ›„, ์‡ผํ•‘๋ชฐ์ด ๋‹ซ๊ธฐ ์ „์— ๊ฐ€์กฑ ๋ชจ๋‘์—๊ฒŒ ์ค„ ์‚ฌํƒ•์„ ์‚ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์กฑ๋“ค์€ ๋…์ ์„ฑ๊ณผ ๊ท ์ผ์„ฑ์„ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹น์‹ ์€ ๊ทธ๋“ค์„ ๊ฐ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ฃผ๋Š” ์‚ฌํƒ•์€ ๋ชจ๋‘ ๋‹จ์ผ ๋ธŒ๋žœ๋“œ์—ฌ์•ผ ํ•˜๋ฉฐ, ๋™์ผํ•œ ๋ธŒ๋žœ๋“œ์˜ ์‚ฌํƒ•์„ ๋‹ค๋ฅธ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๋ฐ›์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋” ์‚ฌ๋ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋“คํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๊ฐ™์€ ์ˆ˜์˜ ์‚ฌํƒ•์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BOJ 14587 ๋„๋ฏธ๋…ธ (Large)

·224 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14587 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ „์ฒ˜๋ฆฌ๋ฅผ ์ ๋‹นํžˆ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋ถ„ํƒ์ƒ‰์„ ์ข€ ํ•˜๋ฉด์„œ ๋ฐ€๋ฉด์„œ ํ•˜๋ฉด, ํŠน์ • ๋„๋ฏธ๋…ธ๋ฅผ ํ•œ์ชฝ์œผ๋กœ ๋ฐ€์—ˆ์„๋•Œ ์–ด๋””๊นŒ์ง€ ๋„˜์–ด๊ฐ€๋Š”์ง€ ํ•  ์ˆ˜ ์žˆ๋‚˜? ์•„, min/max ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ๋˜๋Š”๊ฑฐ๊ฐ™๋‹ค ๋งˆ์ง€๋ง‰์€ ๊ทธ๋ฆฌ๋””๊ฐ€ ์•„๋‹ˆ๋ผ DP๋กœ ํ•ด์•ผํ•œ๋‹ค! ์•„๋‹ˆ๊ทผ๋ฐ X๊ฐ€ ์ •๋ ฌ๋˜์–ด ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค;;;;; ๊ทธ๋ž˜๋„ ๊ตฌํ˜„์ด ๋ง‰ ์–ด๋ ต์ง€ ์•Š์€๋“ฏ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<ll> X(N), H(N); vector<pll> dominos(N); rep(i, 0, N) cin >> dominos[i].first >> dominos[i].second; sort(all(dominos)); rep(i, 0, N){ X[i] = dominos[i].first; H[i] = dominos[i].second; } SegmentTreeMinMax ST_min(N), ST_max(N); // calc leftmost ST_min.set(0, 0); rep(i, 1, N){ ll val = X[i] - H[i]; auto idx = lower_bound(all(X), val) - X.begin(); auto Q = ST_min.query(idx, i-1); ST_min.set(i, min((ll)i, ST_min.query(idx, i-1).first)); } // calc rightmost ST_max.set(N-1, N-1); rrep(i, 0, N-1){ ll val = X[i] + H[i]; auto idx = upper_bound(all(X), val) - X.begin() - 1; auto Q = ST_min.query(i+1, idx); ST_max.set(i, max((ll)i, ST_max.query(i+1, idx).second)); } vector<int> DP(N, 1e9); DP[0] = 1; DP[ST_max.get_val(0)] = 1; rep(i, 1, N){ int lft = ST_min.get_val(i)-1; if(lft < 0) DP[i] = 1; else DP[i] = min(DP[i], DP[lft] + 1); int rht = ST_max.get_val(i); DP[rht] = min(DP[rht], DP[i-1] + 1); } cout << DP[N-1]; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 11111 ๋‘๋ถ€์žฅ์ˆ˜ ์žฅํ™์ค€ 2

·218 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/11111 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋Œ€์ถฉ๋ด๋„ ๊ฒฉ์ž๊ทธ๋ž˜ํ”„์—์„œ MCMF๊ฐ™์€๋ฐ.. ๋œ๋Š์–ด๋„ ๋˜๋‹ˆ๊นŒ MaxFlow๊ฐ€ ์•„๋‹Œ๊ฐ€? ์•„ํ•˜ ๋’ค์ง‘์œผ๋ฉด ๋œ๋‹ค ์•„ํ•˜, Flow ์ž์ฒด๋„ ๋‹ค ๋ณด๋‚ด๊ธฐ ์ „์ด ์ตœ์ ์ผ์ˆ˜๋„ ์žˆ๋Š”๊ฒƒ๋งŒ ์žŠ์ง€ ๋ง์ž ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<vector<int>> costs = { {10, 8, 7, 5, 1}, {8, 6, 4, 3, 1}, {7, 4, 3, 2, 1}, {5, 3, 2, 2, 1}, {1, 1, 1, 1, 0} }; vector<vector<int>> board(N, vector<int>(M)); map<char, int> mp; mp['A'] = 0; mp['B'] = 1; mp['C'] = 2; mp['D'] = 3; mp['F'] = 4; rep(i, 0, N){ string S; cin >> S; rep(j, 0, M) board[i][j] = mp[S[j]]; } MinCostMaxFlow MCMF(N*M+2); MCMF.setST(N*M, N*M+1); vector<int> dx = {-1, 1, 0, 0}, dy = {0, 0, -1, 1}; rep(i, 0, N) rep(j, 0, M){ if((i+j)%2){ MCMF.add(i*M+j, N*M+1, 1, 0); continue; } MCMF.add(N*M, i*M+j, 1, 0); rep(d, 0, 4){ int nx = i + dx[d], ny = j + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue; MCMF.add(i*M + j, nx*M + ny, 1, -costs[board[i][j]][board[nx][ny]]); } } cout << max(0LL, -MCMF.match()); } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 35108 ๊ฒŒ๊ตญ์ง€

·433 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/35108 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $N$์ด 2500์ด๋‹ˆ๊นŒ ๋ญ”๊ฐ€ ์ œ๊ณฑ๋กœ๊ทธ?๊นŒ์ง„ ๋Œ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ์Œ, ์–ด๋–ป๊ฒŒ ์žก์œผ๋ฉด ์ข‹์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ € ์ฃผ์–ด์ง„ ๊ฒŒ๊ตญ์ง€ ๊ทธ๋ž˜ํ”„์—์„œ ์•ˆ์ชฝ์˜ ๋„ค๋ชจ์ค‘ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ $1, 2, 3, 4$ ๋ผ๊ณ  ํ•˜๋ฉด, $2, 4$๋ฒˆ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ์นด์šดํŒ…ํ•˜๊ณ ์‹ถ๊ฒŒ ์ƒ๊ธฐ๊ธด ํ–ˆ๋‹ค. ์ผ๋‹จ ์˜ˆ์ œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด์ž. ![[Drawing 2026-03-07 09.54.26.excalidraw.png]] ์—ฌ๊ธฐ์„œ ์ € ๊ฒŒ๊ตญ์ง€๋ชจ์–‘์„ ์ฐพ์•„์•ผ ํ•˜๋Š”๋ฐ… $1, 2, 3, 4$๋ฅผ ๊ธฐ7์ค€์œผ๋กœ ํ•˜๋ฉด $1, 2, 4$์— $5, 7, 6$์„ ๋ถ™์ด๊ฑฐ๋‚˜, $6, 7, 5$๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๊ฒ ๋‹ค. ์–ด.. ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ๋ ค๊ณ  ํ•˜๋‹ˆ ์ข€ ๊นŒ๋‹ค๋กœ์šด๊ฑฐ ๊ฐ™๊ธฐ๋„..? ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„์„ ์„ ๊ธฐ์ค€์œผ๋กœ..? ๊ทธ๋Ÿฌ๋ฉด ์•„๋ฌด๋ž˜๋„ ์–‘์ชฝ์— ๋‚ ๊ฐœ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฐ„์„ ์œผ๋กœ ์ƒ๊ฐํ•˜์ž. ํฌ์•„์•„์•„์•… ์ด๋ž˜๋„ ์•ˆ๋˜๋Š”๋ฐ ์ผ๋‹จ ๋‘ ๊ฐ„์„ ์„ ๊ณจ๋ผ์„œ ์‚ฌ์ดํด์„ ๊ณ ์ •์‹œํ‚ค๋Š”๊ฑด ๋งž๋Š”๊ฑฐ๊ฐ™๋‹ค. ์ž‰ ์ด๋Ÿฌ๋ฉด ๊ฑ ํฌํ•จ๋ฐฐ์ œ๋กœ ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด ๋‘ ์ •์ ์— ์ค‘๋ณต๋˜๋Š” ์ •์ , ์„ธ ์ •์ ์— ์ค‘๋ณต๋˜๋Š” ์ •์  ๋ญ ๊ทธ๋Ÿฐ๊ฒŒ ํ•„์š”ํ•œ๊ฑฐ๊ฐ™์€๋ฐ… ๋น„ํŠธ์…‹์œผ๋กœ ํ•˜๋ฉด ๋ ๋ผ๋‚˜? $O(M^2N/64)$ ์ •๋„์ธ๊ฑฐ๊ฐ™์€๋ฐ;; ์ผ๋‹จ ์งœ๋ณด์ž ์ข€ ๋นก๋นกํ•˜๋‹ค. ์ „์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•˜๋ฉด ์‹œ๊ฐ„ ๋‚ด๋กœ ๋“ค์–ด๊ฐ„๋‹ค. Clang์ด ํ›จ ๋น ๋ฅด๋„ค. ์™œ์ง€? ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<pii> edges; vector<bitset<2500>> con(N); rep(i, 0, M){ int u, v; cin >> u >> v; u--; v--; edges.push_back({u, v}); con[u][v] = 1; con[v][u] = 1; } vector<ll> cnt1(N); rep(i, 0, N) cnt1[i] = con[i].count(); vector<vector<bitset<2500>>> con2(N, vector<bitset<2500>>(N)); rep(i, 0, N) rep(j, i+1, N) con2[i][j] = con2[j][i] = con[i]&con[j]; vector<vector<ll>> cnt2(N, vector<ll>(N)); rep(i, 0, N) rep(j, i+1, N) cnt2[i][j] = cnt2[j][i] = con2[i][j].count(); auto calc = [&](int v1, int v2, int v3, int v4) -> ll { auto &b1 = con[v1], &b2 = con[v2], &b3 = con[v3]; ll n1 = cnt1[v1] - (con[v1][v2] + con[v1][v3] + con[v1][v4]); ll n2 = cnt1[v2] - (con[v2][v1] + con[v2][v3] + con[v2][v4]); ll n3 = cnt1[v3] - (con[v3][v1] + con[v3][v2] + con[v3][v4]); ll n12 = cnt2[v1][v2] - (con2[v1][v2][v3] + con2[v1][v2][v4]); ll n23 = cnt2[v2][v3] - (con2[v2][v3][v1] + con2[v2][v3][v4]); ll n31 = cnt2[v3][v1] - (con2[v3][v1][v2] + con2[v3][v1][v4]); bitset<2500> b123 = b1&b2&b3; ll n123 = b123.count() - b123[v4]; return n1*n2*n3 - (n12*n3 + n23*n1 + n31*n2) + 2*n123; }; ll ans = 0; rep(i, 0, M) rep(j, i+1, M){ auto [a, b] = edges[i]; auto [c, d] = edges[j]; if(a == c || a == d || b == c || b == d) continue; if((!con[a][c] || !con[b][d]) && (!con[a][d] || !con[b][c])) continue; ll ret = 0; ret += calc(a, b, c, d); ret += calc(b, c, d, a); ret += calc(c, d, a, b); ret += calc(d, a, b, c); if(con[a][c] && con[b][d]) ans += ret; if(con[a][d] && con[b][c]) ans += ret; } cout << ans/2; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 11493 ๋™์ „ ๊ตํ™˜

·195 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/11493 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋™์ „๋“ค์„ swapํ•ด์„œ ์ž˜ ์˜ฎ๊ฒจ์„œ ๋งž์ถฐ์•ผํ•œ๋‹ค.. ์ผ๋‹จ ์ƒ‰์„ ๋ชจ๋‘ ์‹ ๊ฒฝ์“ฐ๊ธด ์‹ซ์œผ๋‹ˆ๊นŒ, 1์˜ ์œ„์น˜๋ฅผ ๋งž์ถ˜๋‹ค๊ณ ๋งŒ ์ƒ๊ฐํ•˜์ž. ๋ญ”๊ฐ€ ์ด๋ถ„๊ทธ๋ž˜ํ”„์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ์ด๊ฒŒ ์›€์ง์ด๋Š”๊ฒƒ๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ํ”Œ๋กœ์ด๋“œ์›Œ์…œ + ์ด๋ถ„๊ทธ๋ž˜ํ”„ ๋งค์นญ ์ตœ์†Œ๋น„์šฉ…์œผ๋กœ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ๊ฐ™์€๋ฐ? ๊ทผ๋ฐ swap์ด๋‹ค๋ณด๋‹ˆ ์ด๋ ‡๊ฒŒ ๋ง˜๋Œ€๋กœ ํ•˜๋Š”๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ๋ฌด์‹œ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ ์ด๋ถ„๊ทธ๋ž˜ํ”„๋กœ ์ƒ๊ฐ์„ ์ข€ ํ•ด๋ณด๊ธด ํ•˜์ž. ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด์ž. ![[Drawing 2026-03-07 15.31.09.excalidraw.png]] ๊ทธ๋ฆผ 1์˜ ์˜ˆ์‹œ์ด๋‹ค. ์–ด์šฐ ๋‚œ์žกํ•ด ใ…‹ใ…‹ ๋ญ”๊ฐ€ ์ฆ๊ฐ€๊ฒฝ๋กœ ๋ง›์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ๊ฐ™๊ธฐ๋Š” ํ•œ๋ฐ.. ….๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ์ด์ƒํƒœ๋กœ ์ตœ์†Œ๋น„์šฉ ์ตœ๋Œ€์œ ๋Ÿ‰ ์•„๋‹Œ๊ฐ€? ๋์ด๋„ค? ์ด๋ถ„๊ทธ๋ž˜ํ”„๋กœ ๋ถ„ํ• ํ•  ํ•„์š”๋„ ์—†์ด, ๊ทธ๋ƒฅ ์œ ๋Ÿ‰์œผ๋กœ ๋‹ฌ๋ฆฌ๋ฉด ๋œ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; MinCostMaxFlow MCMF(N+2); MCMF.setST(0, N+1); rep(i, 0, M){ int u, v; cin >> u >> v; MCMF.add(u, v, 1e9, 1); MCMF.add(v, u, 1e9, 1); } rep(i, 1, N+1){ int x; cin >> x; if(x == 1) MCMF.add(0, i, 1, 0); } rep(i, 1, N+1){ int x; cin >> x; if(x == 1) MCMF.add(i, N+1, 1, 0); } cout << MCMF.match() << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 23887 ํ”„๋ฆฐํŠธ ์ „๋‹ฌ

·298 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/23887 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์„ค๋ช…์„ ๋Œ€์ถฉ ์ฝ๋Š”๋ฐ, BFS๋ง›์ด ๋‚œ๋‹ค ํ—ˆ๊ฑฑ, ์ตœ๋Œ€ ํ•™์ƒ์ด 25000๋ช…์ด๋ผ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ๋Š” ์กฐ๊ธˆ ๊ณค๋ž€ํ•˜๊ธด ํ•˜๋‹ค ๊ทผ๋ฐ ๋ญ”๊ฐ€ ํŠธ๋ฆฌ์ฒ˜๋Ÿผ ํ•ด์„ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ? MST์ธ๊ฐ€? ์•„ ๊ทผ๋ฐ ์ข€ ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„? ๋ง›์ธ๋ฐ… ์œ„์ƒ์ •๋ ฌ์ด๋„ค ์ด๊ฑฐ ์—ฅ? ๊ทผ๋ฐ ์ด๊ฒŒ $2$๋ฒˆ ํ•™์ƒ์ด $5, 6$๋ฒˆํ•œํ…Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ณ ํ•ด์„œ ๋ฌด์กฐ๊ฑด $5$๋ฒˆํ•œํ…Œ๋งŒ ๋ฐ›๋Š”๊ฑด ์•„๋‹ˆ๋„ค? ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ํŠธ๋ฆฌ๋ง›์œผ๋กœ? ๊ทธ๋Ÿฌ๋ฉด ๋ญ”๊ฐ€ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋А๋‚Œ์œผ๋กœ ๊ฐ€์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ… ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€์žฅ ๋จผ ๋‘ ์ ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? ???????? ์•„๋‹ˆ ๋ฌธ์ œ์—์„œ $S$๊ฐ€ ์ฃผ์–ด์ง€๋Š”๊ฑฐ์˜€๋„ค ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ BFS๋ฅผ ๋Œ๋ฆฌ์ž ๊ตฌํ˜„์ด ์ƒ๋‹นํžˆ ์žฌ๋ฐŒ๋‹ค! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M, K; cin >> N >> M >> K; vector<vector<int>> board(N, vector<int>(M, 0)); vector<pii> students(K+1); vector<bool> visited(K+1); rep(i, 1, K+1){ int x, y; cin >> x >> y; x--; y--; students[i] = {x, y}; board[x][y] = i; } int S; cin >> S; set<int> Q; Q.insert(S); visited[S] = true; vector<vector<int>> links(K+1); vector<int> dx = {-1, -1, -1, 0, 0, 1, 1, 1}; vector<int> dy = {-1, 0, 1, -1, 1, -1, 0, 1}; while(!Q.empty()){ set<int> nQ; for(auto cur: Q){ auto [cx, cy] = students[cur]; rep(d, 0, 8){ int nx = cx + dx[d]; int ny = cy + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if(board[nx][ny] == 0) continue; int nxt = board[nx][ny]; if(visited[nxt]) continue; visited[nxt] = true; links[cur].push_back(nxt); nQ.insert(nxt); } } swap(Q, nQ); } rep(i, 1, K+1) if(!visited[i]){ cout << -1; return; } vector<int> sz(K+1); function<void(int)> dfs = [&](int cur){ sz[cur] = 1; for(auto nxt: links[cur]){ dfs(nxt); sz[cur] += sz[nxt]; } }; dfs(S); rep(i, 1, K+1) cout << sz[i] << ' '; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 15309 ์Šคํ‚ฌ ํŠธ๋ฆฌ

·373 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/15309 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ด์ง„ํŠธ๋ฆฌ..๋Š” ์•„๋‹ˆ๊ณ  ์‚ผ๊ฐํ˜•์ด๊ตฌ๋‚˜. ๊ฑ ์ข€ ํŽด์„œ ์ƒ๊ฐํ•˜๋ฉด, ์ดํ•ญ๊ณ„์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. $i$๋ฒˆ์งธ ์ค„์€ $(Ax + B)^i$ ์˜ ๊ณ„์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๋“ฏ? ์•„ ๊ทผ๋ฐ ๊ทธ ๋ญ๋ƒ ๊ฒน์น˜๊ฒŒ ํ•˜๋ฉด ์•ˆ๋˜๋Š”๊ตฌ๋‚˜ ํŠน์ • ์‚ผ๊ฐํ˜•์€ ๊ทธ ์ดˆํ•ญ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๊ฒƒ๊ฐ™์œผ๋‹ˆ๊นŒ, $m$๊ฐœ์˜ ํ–‰์„ ํฌํ•จํ•˜๋Š” ์ •์‚ผ๊ฐํ˜•์„ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ๋Œ€์ถฉ ๋กœ๊ทธ์ •๋„์— ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๋Š”๋ฐ.. ์ผ๋‹จ ์ดˆํ•ญ์ด 1์ผ๋•Œ ์‹์€ ๋ญ๋ž‘ ๊ฐ™์ง€? $1 + (A+B) + (A^2 + AB + B^2) + \cdots$ ๊ฐ™์€ ๋А๋‚Œ์ธ๊ฑด๋ฐ… ์–ด์ฐจํ”ผ ํ–‰ ์ž์ฒด์—๋Š” ๋ˆ„์ ํ•ฉ ๋ง›์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค. ์–ด๋ผ? ์ด๊ฑด ๊ทธ๋ƒฅ ์œ— ํ–‰์—๋‹ค๊ฐ€ $A$๋ฅผ ๊ณฑํ•˜๊ณ , $B^N$๋งŒ ๋”ํ•˜๋ฉด ๋ ๊ฑฐ๊ฐ™์€๋”ฉ. ๋Œ€์ถฉ ํ•ด๋ฒ„๋ฆฌ์ฃ ? ์•„๋‹ˆ ์ž ๊น๋งŒ!!!!!!!!! $m$์ด $10^{18}$์ด๋‹ค!! ๋น„์ƒ!!!!!!!!! ๋กœ๊ทธ๊ฐ€ ๋ถ™์„๋งŒํ•œ๊ณณ์€ ๋ถ„ํ• ์ •๋ณต ๊ฑฐ๋“ญ์ œ๊ณฑ๊ฐ™์€๊ฑฐ๋ฐ–์— ์—†๋Š”๋ฐ… ์•„ ์ž ๊น๋งŒ. ์ด๊ฑฐ ๊ทธ๋ƒฅ ๊ทธ ์œ ๋ช…ํ•œ ๊ณ ๋”ฉ๋•Œ ๊ทธ ๊ณต์‹์ฒ˜๋Ÿผ $(A-B)$๊ณฑํ•˜๋ฉด ์ •๋ฆฌ๋˜๋Š” ๊ผด ์•„๋‹Œ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด $(A-B) + (A^2 - B^2) + (A^3 - B^3) + \cdots$ ์ด๊ฑด $(A + A^2 + \cdots + A^m) - (B + B^2 + \cdots + B^m)$์ด์ž๋‚˜! $\frac{A^{m+1} - 1}{A-1} - \frac{B^{m+1} - 1}{B-1}$ ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ , ์ด๊ฑธ $A-B$๋กœ ๋‚˜๋ˆ ์„œ ๋๋‚ด์ž. ์•„!! $A = B$์ธ ๊ฒฝ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๊ณ , $A = 1$์ด๋‚˜ $B = 1$์ธ๊ฒฝ์šฐ๋„ ์กฐ์‹ฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. $A = B$๋ผ๋ฉด? $1 + 2A + 3A^2 + \cdots + mA^{m-1}$ ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋Š”๋ฐ, ์ € ํ•ฉ์„ $S$๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด $AS - S = 1 + A + A^2 + \cdots + A^m$ ๋‹ˆ๊นŒ, $A = 1$์ธ ๊ฒฝ์šฐ ๋ง๊ณ ๋Š” ์ด๊ฑธ ๊ตฌํ•ด์„œ $A-1$๋กœ ๋‚˜๋ˆ„๋ฉด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ? ์ผ€์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ์กฐ์‹ฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ mint A, B; cin >> A >> B; int Q; cin >> Q; while(Q--){ ll x, y, m; cin >> x >> y >> m; x--; y--; mint cho = 1; cho *= A.pow(x-y); cho *= B.pow(y); mint trig = 0; if(A == B){ if(A == 1) trig = mint(m)*(m+1)/2; else trig = (A.pow(m+1) - 1) / (A - 1).pow(2); } else{ if(A == 1) trig += m; else trig += (A.pow(m+1) - 1) / (A - 1) - 1; if(B == 1) trig -= m; else trig -= (B.pow(m+1) - 1) / (B - 1) - 1; trig /= (A-B); } cout << cho * trig << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ