·719 words·4 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/18214 λ²μ λ¬Έμ λ²μ # Susanμ μν μ 리λ μνμ§λ§, μ¬λ¬΄μ€ μ±
μ μ 리λ μ λͺ»ν©λλ€.
Susanμ λ°©κΈ μΌλ ¨μ λ¬Έμλ€μ λν μλ₯ μμ
μ λ§μ³€κ³ , λ¬Έμλ€μ μ¬μ ν μ±
μμ μμ¬ μμ΅λλ€. λ¬Έμλ€μ μΌλ ¨λ²νΈκ° μμΌλ©°, μμ¬κ° κ°μ Έμμ λλ μμλλ‘ μμ¬ μμμ΅λλ€. κ·Έλ¬λ μ§κΈμ μμκ° μλ²½νμ§ μμλ°, Susanμ΄ λ무 κ²μλ¬μ λλ―Έμμ λΉ μ Έλμ¨ λ¬Έμλ€μ μ μ리μ λ€μ λ£μ§ μμκΈ° λλ¬Έμ
λλ€. μμ
μ΄ λλ¬λ€λ μμμ λ£κ³ , μμ¬λ κ·Έλ
μκ² λ³΄λ΄κ³ μλ λ¬Έμ μμμ λ¬Έμλ€μ μ¦μ λ°λ©νκΈ°λ₯Ό μν©λλ€. λ¬Όλ‘ λ¬Έμλ€μ μΌλ ¨λ²νΈ μμλλ‘ μμμ 보κ΄λμ΄μΌ ν©λλ€.
·537 words·3 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/23569 λ²μ λ¬Έμ λ²μ # λ¬Έμ μ€λͺ
# μ¬λλ€ κ°μ μνΈμμ©μ΄ μ£Όμ΄μ§ λ, μ μ μ΄ μ¬λλ€μ΄κ³ λ μ¬λμ΄ μλ‘ μΉκ΅¬μΈ κ²½μ°μλ§ κ·Έλ€ μ¬μ΄μ κ°μ μ΄ μλ κ·Έλνλ₯Ό μ μν μ μμ΅λλ€. μ΄λ¬ν κ·Έλνλ₯Ό μμ
λ€νΈμν¬λΌκ³ νλ©°, μλ₯Ό λ€μ΄ λνμ νμλ€μ΄λ μμ λ§μμ μ£Όλ―Όλ€κ³Ό κ°μ λͺ¨λ μ¬λλ€μ μ§ν©μ λν΄ μ μ μλ©λλ€. μ΅κ·Ό λͺ λ
κ° μμ
λ€νΈμν¬λ₯Ό λΆμνλ μμ ν κ³Όν λΆμΌκ° μ겨λ¬λλ°, μ΄λ μ¬λλ€κ³Ό κ·Έλ€μ νλμ λν λ§μ ν₯λ―Έλ‘μ΄ μΈ‘λ©΄λ€μ΄ μ΄ μΉκ΅¬ κ΄κ³ κ·Έλνμ μμ±μΌλ‘ κ°μ₯ μ μ΄ν΄λκΈ° λλ¬Έμ
λλ€.
·254 words·2 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/1154 π§ κ΄μ°° λ° μ κ·Ό # A / BνμΌλ‘ λλλκ±Έ 보면 λΉμ°ν μ΄λΆκ·Έλνλ₯Ό λ μ¬λ¦΄ μ μκ² λλ°.. κ°μ κ·Έλ£Ήμ νμλ€λΌλ¦¬λ λͺ¨λ μλ‘ μλ μ¬μ΄μ¬μΌ νλ€? μ°λ¦¬κ° μλ μ΄λΆκ·Έλνμ μ μλ λκ° λλμ΄ λ€λ₯΄λ€! μ λ§μ λ€μνλ² μκ°ν΄λ³΄μ κ°μ κ·Έλ£Ήμ νμμ΄λ€ -> μλ‘ μλμ¬μ΄μ΄λ€ μ΄ λ¬Έμ₯μ λμ°λͺ
μ λ? μλ‘ λͺ¨λ₯΄λ μ¬μ΄μ΄λ€ -> λ€λ₯Έ κ·Έλ£Ήμ νμμ΄λ€ κ·Έλ λ€λ©΄, κ·Έλνμ κ°μ μ λ€μ§μ΄λ²λ¦¬μ! $N$μ μ΅λ 1000μ΄λ―λ‘, κ°μ $M = N^2$κ°λ μΆ©λΆν κ³μ°ν μ μλ€. μ΄λ κ² κ°μ μ λ€μ§μ κ·Έλνλ₯Ό μ¬ κ·Έλν, νΉμ complement graphλΌκ³ νλ€. π» νμ΄ # μ½λ (C++): void solve(){ cin >> N; while(1){ int u, v; cin >> u >> v; if(u == -1 && v == -1) break; know[u][v] = know[v][u] = true; } bool isBipartite = true; vector<int> color(N+1, 0); rep(i, 1, N+1) if(color[i] == 0){ queue<int> Q; Q.push(i); color[i] = 1; while(!Q.empty()){ int cur = Q.front(); Q.pop(); rep(nxt, 1, N+1){ if(cur == nxt) continue; if(know[cur][nxt]) continue; if(color[nxt] == 0){ color[nxt] = (color[cur] == 1 ? 2 : 1); Q.push(nxt); } else if(color[nxt] == color[cur]){ isBipartite = false; break; } } } } if(!isBipartite){ cout << -1; return; } vector<int> team1, team2; rep(i, 1, N+1){ if(color[i] == 1) team1.push_back(i); else team2.push_back(i); } cout << 1 << "\n"; for(auto x: team1) cout << x << " "; cout << -1 << "\n"; for(auto x: team2) cout << x << " "; cout << -1 << "\n"; } π ꡬν μ½λ μ κΈ
·335 words·2 mins
π λ¬Έμ μ 보 # λ§ν¬: https://www.acmicpc.net/problem/23086 π§ κ΄μ°° λ° μ κ·Ό # κ·Έλνμ κ°μ μ΄ μ£Όμ΄μ‘μλ, νΉμ μμ μ μ΄λΆ κ·ΈλνμΈκ°?λ₯Ό μ°Ύλ λ¬Έμ μ΄λ€. μ΄λΆκ·Έλνλ₯Ό νμ νλλ°μλ $O(N+M)$μ μκ°μ΄ κ±Έλ¦°λ€. μ§κ΄μ μΌλ‘ μκ°ν΄λ³΄λ©΄, 리μ€νΈμ μ°μΈ μ°¨λ‘λλ‘ μΉν μΉκ΅¬λ₯Ό μ κ΅μν¬ μ μμΌλ―λ‘, 리μ€νΈλ₯Ό λ€μ§μ΄μ νλμ© κ°μ μ μ΄μ΄κ°λ©° ν΄λΉ κ·Έλνκ° μ΄λΆ κ·ΈλνμΈμ§ νμ νλ λ°©λ²μ μΈ μ μμ κ²μ΄λ€. μ΄λ μκ° λ³΅μ‘λλ $O(K(N+M))$μ΄λ€. μ΄λ λ무 λ리λ€! λ¬Έμ μν©μ μ‘°κΈ λ κ΄μ°°ν΄λ³΄μ. $\text{ans}$κ°μ μΉν μΉκ΅¬ μμ μ κ΅μμΌ μ΄λΆ κ·Έλνκ° μ±λ¦½νλλ‘ νλ€λ©΄, $\text{ans}+1$κ°μ μμ μ κ΅μμΌ°μλλ λ§μ°¬κ°μ§λ‘ μ΄λΆκ·ΈλνμΌ κ²μ΄λ€. $0 \leq a \leq K$μΈ $a$μ λν΄, μ΄λΆκ·Έλνκ° μ±λ¦½νλμ§λ λ¨μ‘°μ±μ΄ μ‘΄μ¬νλ€! **λ§€κ°λ³μ νμ(νλΌλ©νΈλ¦ μμΉ)**κ° κ°λ₯νλ€. π» νμ΄ # μ½λ (C++): int N, M, K; vector<pair<int, int>> links[100010]; // (nxt, idx) vector<int> prohibit_list; int color[100010]; // 0: unvisited, 1: group A, 2: group B bool prohibited[200010]; bool isBipartite(int cnt){ rep(i, 1, M+1) prohibited[i] = false; rep(i, 0, cnt) prohibited[prohibit_list[i]] = true; rep(i, 1, N+1) color[i] = 0; rep(i, 1, N+1) if(color[i] == 0){ queue<int> Q; Q.push(i); color[i] = 1; while(!Q.empty()){ int cur = Q.front(); Q.pop(); for(auto [nxt, idx]: links[cur]){ if(prohibited[idx]) continue; if(color[nxt] == 0){ color[nxt] = (color[cur] == 1 ? 2 : 1); Q.push(nxt); } else if(color[nxt] == color[cur]){ return false; } } } } return true; } void solve(){ cin >> N >> M >> K; rep(i, 1, M+1){ int u, v; cin >> u >> v; links[u].push_back({v, i}); links[v].push_back({u, i}); } rep(i, 0, K){ int p; cin >> p; prohibit_list.push_back(p); } // λͺ¨λ κΈμ§νμλ μ΄λΆ κ·ΈλνμΈκ°? if(!isBipartite(K)){ cout << -1; return; } // νλΌλ©νΈλ¦ μμΉ int ok = K, ng = -1; while(ok - ng > 1){ int mid = (ok + ng) >> 1; if(isBipartite(mid)) ok = mid; else ng = mid; } cout << ok << "\n"; int groupA_sz = 0, groupB_sz = 0; isBipartite(ok); rep(i, 1, N+1) color[i] == 1 ? groupA_sz++ : groupB_sz++; cout << min(groupA_sz, groupB_sz) << ' ' << max(groupA_sz, groupB_sz) << "\n"; } π ꡬν μ½λ μ κΈ