結果
問題 | No.1123 Afforestation |
ユーザー |
|
提出日時 | 2020-12-30 14:12:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,317 bytes |
コンパイル時間 | 3,480 ms |
コンパイル使用メモリ | 212,604 KB |
最終ジャッジ日時 | 2025-01-17 08:33:31 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 70 TLE * 20 |
ソースコード
#include <bits/stdc++.h>using namespace std;template<typename T = int, T INF = 0x3f3f3f3f>struct EKarp {int n;vector<vector<T>> capacity;vector<vector<int>> adj;EKarp(int _n) : n(_n), capacity(_n, vector<T>(_n)), adj(_n) {}void addEdge(T w, int u, int v) {adj[u].push_back(v);adj[v].push_back(u);capacity[u][v] += w;}T bfs(int s, int t, vector<int> &parent) {fill(parent.begin(), parent.end(), -1);parent[s] = -2;queue<pair<int, int>> que;que.push({ s, INF });while (que.size()) {auto [cur, flow] = que.front();que.pop();for (int nxt : adj[cur]) {if (parent[nxt] == -1 && capacity[cur][nxt]) {parent[nxt] = cur;T nflow = min(flow, capacity[cur][nxt]);if (nxt == t) return nflow;que.push({ nxt, nflow });}}}return (T) 0;}T maxflow(int s, int t) {T flow = 0;vector<int> parent(n);T nflow;while (nflow = bfs(s, t, parent)) {flow += nflow;int cur = t;while (cur != s) {int pre = parent[cur];capacity[pre][cur] -= nflow;capacity[cur][pre] += nflow;cur = pre;}}return flow;}};int main() {ios::sync_with_stdio(false);int H, W; {cin >> H >> W;}vector<int> A(H); {for (int i = 0; i < H; ++i) cin >> A[i];}vector<int> B(W); {for (int i = 0; i < W; ++i) cin >> B[i];}int K; {cin >> K;}vector<int> X(K), Y(K); {for (int i = 0; i < K; ++i) cin >> X[i] >> Y[i], --X[i], --Y[i];}set<pair<int, int>> badBag; {for (int i = 0; i < K; ++i) badBag.emplace(X[i], Y[i]);}EKarp ekarp(H + W + 2); {for (int i = 0; i < H; ++i) ekarp.addEdge(A[i], H + W, i);for (int i = 0; i < W; ++i) ekarp.addEdge(B[i], H + i, H + W + 1);for (int i = 0; i < H; ++i) {for (int j = 0; j < W; ++j) {int w = !badBag.count(make_pair(i, j));ekarp.addEdge(w, i, H + j);}}}int gc = 0; {auto a = A;auto b = B;for (int i = 0; i < H; ++i) {for (int j = 0; j < W; ++j) {if (badBag.count(make_pair(i, j))) continue;if (a[i] && b[j]) {--a[i];--b[j];assert(ekarp.capacity[i][H + j] == 1);ekarp.capacity[i][H + j] -= 1;ekarp.capacity[H + j][i] += 1;assert(ekarp.capacity[H + W][i] > 0);ekarp.capacity[H + W][i] -= 1;ekarp.capacity[i][H + W] += 1;assert(ekarp.capacity[H + j][H + W + 1] > 0);ekarp.capacity[H + j][H + W + 1] -= 1;ekarp.capacity[H + W + 1][H + j] += 1;++gc;}}}}int mf = ekarp.maxflow(H + W, H + W + 1);int sumA = accumulate(A.begin(), A.end(), 0);int sumB = accumulate(B.begin(), B.end(), 0);if (gc + mf != max(sumA, sumB)) {cout << ":(" << endl;} else {cout << "Yay!" << endl;vector<string> res(H, string(W, '.')); {for (int i = 0; i < K; ++i) {res[X[i]][Y[i]] = 'x';}for (int i = 0; i < H; ++i) {for (int j = 0; j < W; ++j) {if (ekarp.capacity[H + j][i] == 1) res[i][j] = 'o';}}}for (int i = 0; i < H; ++i) cout << res[i] << "\n";}}