·405 words·2 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1734 π§ κ΄μ°° λ° μ κ·Ό # 무ν₯ κ·Έλν $G = (V, E)$κ° μ£Όμ΄μ§λ€.
μ¬κΈ°μ λκ°μ§ μΏΌλ¦¬κ° μ£Όμ΄μ§λ€.
κ°μ $e \in E$ νλλ₯Ό μμ΄μ λ, μ μ $A, B$μ μ°κ²°μ± νμ μ μ $v \in V$ νλλ₯Ό μμ΄μ λ, μ μ $A, B$μ μ°κ²°μ± νμ κ°κ° μ΄ν΄λ³΄μ. λ¨Όμ , λ¬Έμ 쑰건μ μν΄ μ»΄ν¬λνΈλ νλμ΄λ―λ‘ A, Bλ κΈ°λ³Έμ μΌλ‘ μ°κ²°λμ΄μλ€κ³ νλ¨νμ.
·152 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1647 π§ κ΄μ°° λ° μ κ·Ό # μ§ (μ μ )κ³Ό κΈΈ (κ°μ )μ΄ μλ€. λ§μ λκ°λ‘ λΆλ¦¬ν΄μΌνλ€. μ΄ λ, κ°μ μ κ°μ€μΉμ ν©μ μ΅μνν΄μΌνλ€. μ΄λ―Έ λ μ§μ΄ ν λ§μ μμ μλ€λ©΄, λμ΄ μ°κ²°ν νμκ° μλ€. μ΄λ―Έ λ€λ₯Έ μ°νλ‘λ‘ κ° μ μκΈ° λλ¬Έ μ°κ²°νλ λμ€ λ§μμ΄ λκ°κ° λ¨μλ€λ©΄ λλ΄λ©΄ λλ€. ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦μΌλ‘ λ©μ΄λ¦¬κ° λκ°κ° λ¨μλκΉμ§ λ°λ³΅νλ©΄ λκ² λ€. π» νμ΄ # μ½λ (C++): void solve(){ int N, M; cin >> N >> M; vector<tuple<int, int, int>> edges; // weight, u, v rep(i, 0, M){ int u, v, w; cin >> u >> v >> w; edges.emplace_back(w, u, v); } UF.init(N+1); sort(all(edges)); int ans = 0; for(auto &[w, u, v]: edges){ if(UF.group == 3) break; if(UF.merge(u, v)) ans += w; } cout << ans << "\n"; } π ꡬν μ½λ μ κΈ
·145 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/10775 π§ κ΄μ°° λ° μ κ·Ό # 1λ² κ²μ΄νΈκ° μ μΌ μ°κΈ° μ’μ보μΈλ€. κ·Έλ¬λ―λ‘ 1λ² κ²μ΄νΈλ₯Ό μλλ€κ³ μκ°νλ©΄, λͺ¨λ λΉνκΈ°λ₯Ό λνΉμν¬λ κ° μ μλ μ΅λκ°μΌλ‘ λνΉμν€λ©΄ λλ κ² κ°λ€. μ΄λ₯Ό λμ΄λΈνκ² κ΅¬ννλ©΄ νλ²λΉ $O(G)$κ° κ±Έλ¦΄ κ²μ΄λ€. 100000 100000 100000 100000 100000 ... κ³Ό κ°μ ν
μ€νΈμΌμ΄μ€λ₯Ό μκ°ν΄λ³΄λ©΄ λλ€. λ°λΌμ $\text{calc}(g_i) = g_i$ λ³΄λ€ μκ±°λ κ°μ μ΄μμλ κ²μ΄νΈμ μ΅λκ°μ λΉ λ₯΄κ² μ°ΎμΌλ©΄ λλ€. μ΄λ μ λμ¨νμΈλλ‘ λΉ λ₯΄κ² μν κ°λ₯νλ€! mergeν λ μμ λ³΄λ€ μμ κ°μ κ°λ¦¬ν€κ² νμ. π» νμ΄ # μ½λ (C++): void solve(){ int G, P; cin >> G >> P; UF.init(G+1); int ans = 0; while(P--){ int g; cin >> g; int rt = UF.find(g); if(rt == 0) break; UF.merge(rt, rt-1); ans++; } cout << ans << "\n"; } π ꡬν μ½λ μ κΈ
·161 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1043 π§ κ΄μ°° λ° μ κ·Ό # μ§λ―Όμ΄λ λͺ¨λ νν°μ μ°Έμ¬ν΄μΌνλ―λ‘, μ§μ€μ μλ μ¬λμ΄ μλ νν°μ λͺ¨λ μ¬λμ μ§μ€μ μκ² λλ€. λͺ¨λ νν°μ λν΄ μ§μ€μ μκ² λ μ¬λμ νμΈν ν, μ§μ€μ μλμ¬λμ΄ μλ νν°λ€μ μλ₯Ό μΈλ©΄ λλ€. μ λμ¨ νμΈλ, λΆλ¦¬ μ§ν©μΌλ‘ ν΄κ²°νμ. π» νμ΄ # μ½λ (C++): void solve(){ int N, M; cin >> N >> M; vector<vector<int>> parties; UnionFind UF(N+1); // 0μ μ§μ€μ μλ μ¬λ int cnt; cin >> cnt; rep(i, 0, cnt){ int a; cin >> a; UF.merge(0, a); } rep(i, 0, M){ cin >> cnt; vector<int> party(cnt); rep(j, 0, cnt) cin >> party[j]; parties.push_back(party); rep(j, 0, cnt-1) UF.merge(party[j], party[j+1]); } int ans = 0; for(auto party: parties){ bool flag = true; for(auto p: party) if(UF.find(p) == 0) flag = false; if(flag) ans++; } cout << ans; } π ꡬν μ½λ μ κΈ
·212 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/4013 π§ κ΄μ°° λ° μ κ·Ό # κ·Έλνκ° DAGλΌλ©΄ μμμ λ ¬μ νλ©΄μ DPλ₯Ό μ§νν μ μμν
λ°.. κ°μ μ μ μ μ¬λ¬λ² λ€λ¦΄ μ μμΌλ―λ‘, μ΄λ€ μ μ μ΄ μ¬μ΄ν΄ μμ λ€μ΄μλ€λ©΄ ν΄λΉ μ¬μ΄ν΄ λ΄μ ATMμ λͺ¨λ λ€λ¦΄ μ μλ€! μλ‘ μμ λ‘κ² μ΄λ κ°λ₯ν κ΄κ³λΌλ©΄ λͺ¨λ μμ λ‘κ² λ€λ¦΄ μ μμΌλ―λ‘, μ΄λ₯Ό SCCλ‘ λ¬Άμ΄ DAGλ‘ λ§λ€μ. π» νμ΄ # μ½λ (C++): void solve(){ cin >> N >> M; DirectedGraph graph(N+1); rep(i, 0, M){ int u, v; cin >> u >> v; graph.add_edge(u, v); } DirectedGraph dag = graph.getCompressedGraph(); int sz = dag.V; vector<int> val(sz), DP(sz, -1e9), indeg(sz, 0); rep(i, 1, N+1){ int X; cin >> X; val[graph.sccId[i]] += X; } int S, P; cin >> S >> P; S = graph.sccId[S]; DP[S] = val[S]; rep(u, 0, sz) for(auto &v: dag.links[u]) indeg[v]++; queue<int> Q; rep(i, 0, sz) if(indeg[i] == 0) Q.push(i); while(!Q.empty()){ int cur = Q.front(); Q.pop(); for(auto nxt: dag.links[cur]){ DP[nxt] = max(DP[nxt], DP[cur] + val[nxt]); indeg[nxt]--; if(indeg[nxt] == 0) Q.push(nxt); } } int ans = 0; rep(i, 0, P){ int X; cin >> X; X = graph.sccId[X]; ans = max(ans, DP[X]); } cout << ans << '\n'; } π ꡬν μ½λ μ κΈ
·165 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/3648 π§ κ΄μ°° λ° μ κ·Ό # λͺ¨λ μ¬μ¬μμμ λν΄ (and) κ° μ¬μ¬μμλ³λ‘ ν λκ°μ€ νλλ₯Ό λ§μ‘±ν΄μΌ νλ€. (or) λ°λΌμ $(A \lor B) \land (C \lor D) \land \cdots$ μ 2-sat λ¬Έμ λ‘ λ³ν κ°λ₯νλ€! λͺ¨λΈλ§λ§ μ ν΄λ³΄μ. κ°λ₯ν λ³μμ κ°μ $= 1000 *2 = 2000$ μ λν΄ $i$ λ² μ°Έκ°μκ° μ§μΆ: $2*i$, μ§μΆ μ€ν¨: $2*i+1$λ‘ λͺ¨λΈλ§νμ. 1λ² μ°Έκ°μμΈ μκ·Όμ΄λ 무쑰건 ν΅κ³Όν΄μΌ νλ€. $\neg x \to x$ λ₯Ό λ§μ‘±νλ©΄ λλ―λ‘, $1 \to 0$μ μΆκ°νμ. π» νμ΄ # μ½λ (C++): void solve(){ int N, M; while(cin >> N >> M){ DirectedGraph dg(2*N); rep(i, 0, M){ int u, v; cin >> u >> v; if(u > 0) u = 2*(u-1); else u = 2*(-u-1)+1; if(v > 0) v = 2*(v-1); else v = 2*(-v-1)+1; dg.add_2sat_edge(u, v); } dg.add_2sat_edge(0, 0); cout << (dg.is2SAT() ? "yes\n" : "no\n"); } π ꡬν μ½λ μ κΈ
·146 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/3176 π§ κ΄μ°° λ° μ κ·Ό # λλ‘κ° N-1κ°μΈκ±Έ 보λ νΈλ¦¬κ² κ΅¬λ§ μ΄λ κ²½λ‘μμμ κ°μ₯ μ§§μ λλ‘μ κΈΈμ΄μ κ°μ₯ κΈ΄ λλ‘μ κΈΈμ΄λ₯Ό μΆλ ₯νλΌλλ°… HLDλ₯Ό μ¨λ λμ§λ§, sparse tableμμμ RMQμ²λ¦¬μ²λΌ μ§νν΄λ ν° λ¬Έμ κ° μκ² λ€. π» νμ΄ # μ½λ (C++): void solve(){ cin >> N; rep(i, 0, N-1){ int u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } dfs(1, -1, 0); rep(j, 1, 20) rep(i, 1, N+1) if(par[i][j-1]){ par[i][j] = par[par[i][j-1]][j-1]; mnDist[i][j] = min(mnDist[i][j-1], mnDist[par[i][j-1]][j-1]); mxDist[i][j] = max(mxDist[i][j-1], mxDist[par[i][j-1]][j-1]); } int Q; cin >> Q; while(Q--){ int u, v; cin >> u >> v; auto [mn, mx] = calc(u, v); cout << mn << ' ' << mx << '\n'; } } π ꡬν μ½λ μ κΈ
·226 words·2 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1761 π§ κ΄μ°° λ° μ κ·Ό # νΈλ¦¬μμ, λ μ μ μ¬μ΄μ κ²½λ‘λ μ μΌνλ€. ν΄λΉ κ²½λ‘λ λ μ μ μ LCAλ₯Ό μ§λλ€. λ μ μ¬μ΄μ 거리λ $d(u) + d(v) - 2*d(\text{LCA}(u, v))$λ‘ κ³μ°ν μ μλ€. π» νμ΄ # μ½λ (C++): void dfs(int cur, int _par){ for(auto [nxt, w]: links[cur]){ if(nxt == _par) continue; dist[nxt] = dist[cur] + w; depth[nxt] = depth[cur] + 1; par[nxt][0] = cur; dfs(nxt, cur); } } int LCA(int u, int v){ if(u == v) return u; if(depth[u] < depth[v]) swap(u, v); int diff = depth[u] - depth[v]; rep(i, 0, 16) if((diff >> i) & 1) u = par[u][i]; if(u == v) return u; rrep(i, 16, 0){ if(par[u][i] != par[v][i]){ u = par[u][i]; v = par[v][i]; } } return par[u][0]; } ll getDist(int u, int v){ int lca = LCA(u, v); return dist[u] + dist[v] - 2 * dist[lca]; } void solve(){ cin >> N; rep(i, 0, N-1){ int u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } dfs(1, -1); rep(j, 1, 16) rep(i, 1, N+1) par[i][j] = par[par[i][j-1]][j-1]; cin >> Q; while(Q--){ int u, v; cin >> u >> v; cout << getDist(u, v) << '\n'; } } π ꡬν μ½λ μ κΈ
·510 words·3 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/16367
λ²μ
λ¬Έμ λ²μ # Mr. Dajudaλ TV μΌ νλ‘κ·Έλ¨μΌλ‘ μ λͺ
ν μ¬λμΌλ‘, κ°λ μμ²μλ€μκ² ν₯λ―Έλ‘μ΄ κ²μμ μ μνκ³ μνμ μμΌλ‘ μ 곡ν©λλ€. μ΄λ² μ£Όμ κ·Έκ° μ μν κ²μμ λ€μκ³Ό κ°μ΄ μ€λͺ
ν μ μμ΅λλ€.
무λ μμ kκ°(k > 3)μ λ¨νλ κ²μ μμ μ λͺ¨λ κΊΌμ Έ μμ΅λλ€. νΈμμ λ¨νλ 1λΆν° kκΉμ§ λ²νΈκ° λ§€κ²¨μ Έ μμ΅λλ€. κ° λ¨νλ λΉ¨κ°μ λλ νλμμ μμμ κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ λ¨νμ μμμ μΌμ§κΈ° μ κΉμ§λ μ μ μμ΅λλ€. κ²μ μ°Έκ°μλ€μ 무μμλ‘ μΈ κ°μ λ¨νλ₯Ό μ ννκ³ κ·Έ μμμ μμΈ‘νλλ‘ μμ²λ°μ΅λλ€. κ·Έλ° λ€μ κ° μ°Έκ°μλ μ νν λ¨νμ μμΈ‘λ μμμ΄ κΈ°λ‘λ μ’
μ΄λ₯Ό κ²μ μ§νμμΈ Mr. Dajudaμκ² μ μΆν©λλ€. λͺ¨λ λ¨νκ° μΌμ§λ©΄ κ° μ°Έκ°μλ μμ μ΄ μμΈ‘ν μμ μ€ λͺ κ°κ° λ¨νμ μ€μ μμκ³Ό μΌμΉνλμ§ νμΈν©λλ€. λ κ° μ΄μμ μμμ΄ μΌμΉνλ©΄ μνμ λ°κ² λ©λλ€.
·207 words·1 min
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/14908 π§ κ΄μ°° λ° μ κ·Ό # μ§κ΄μ μΌλ‘ μκ°ν΄λ³΄μ μ΄λ€ μμ
μ 보μκΈ $S_i$κ° ν¬λ€λ©΄, λΉ λ₯΄κ² μμ
μ μννλκ² μ’λ€. μ΄λ€ μμ
μ μλ£νλλ° κ±Έλ¦¬λ μκ° $T_i$κ° μλ€λ©΄, λΉ λ₯΄κ² μμ
μ μννλκ² μ’λ€. μ΄ λκ°μ§λ₯Ό μ΄λ»κ² λμμ νμ©ν μ μμκΉ? μ΄λ€ μ λ΅ $Opt$κ° μ‘΄μ¬νλ€κ³ κ°μ ν΄λ³΄μ. μ΄λ, $Opt$μ μμμ€ κ°μ΄λ° λ μμ
$W_i, W_{i+1}$μ λ°κΎΌλ€κ³ ν΄λ³΄μ. μ΄ λ, λ°λ μμ $Opt'$κ° $Opt$λ³΄λ€ λμ μ μμκΉ? λ μμ
μ λ°κΎΈλ©΄, $Opt' = Opt + S_i * T_{i+1} - S_{i+1} * T_i$κ° λλ€. λ€μλ§ν΄, $S_i * T_{i+1} - S_{i+1} * T_i$ μ΄ μμλΌλ©΄ λ λμ ν΄λ²μ μ°Ύμ μ μλ€. λ°λΌμ $S_i * T_{i+1} - S_{i+1} * T_i > 0$μΈ λ°©ν₯, μ¦ $\frac{S_i}{T_i} \geq \frac{S_{i+1}}{T_{i+1}}$ μ μμλ‘ μ λ ¬νλ©΄ μ΅μ ν΄κ° λλ€. π» νμ΄ # μ½λ (C++): void solve(){ int N; cin >> N; vector<array<int, 3>> ans; // S, T, idx; rep(i, 0, N){ int S, T; cin >> S >> T; ans.push_back({T, S, i+1}); } sort(all(ans), [](const array<int, 3> &a, const array<int, 3> &b){ if(a[0]*b[1] == a[1]*b[0]) return a[2] < b[2]; return a[0]*b[1] > a[1]*b[0]; }); for(auto &p: ans) cout << p[2] << ' '; } π ꡬν μ½λ μ κΈ