Submission #1030312

#TimeUsernameProblemLanguageResultExecution timeMemory
1030312TINDomino (COCI15_domino)C++17
60 / 160
316 ms524292 KiB
#include <bits/stdc++.h> using namespace std; #define FNAME "test" typedef long long ll; const ll oo = 1e18 + 1; struct Edge { int from, to, cap; ll cost; Edge(int from, int to, int cap, ll cost) : from(from), to(to), cap(cap), cost(cost) {} }; struct MinFlow { int n, k, s, t; vector<vector<int>> adj; vector<vector<int>> cap; vector<vector<ll>> cost; MinFlow(int _n, int _k, int _s, int _t) { n = _n; k = _k; s = _s; t = _t; adj.assign(n, vector<int>()); cost.assign(n, vector<ll>(n, 0)); cap.assign(n, vector<int>(n, 0)); } void addEdge(Edge e) { assert(0 <= e.from && e.from <= n); assert(0 <= e.to && e.to <= n); adj[e.from].push_back(e.to); adj[e.to].push_back(e.from); cost[e.from][e.to] = e.cost; cost[e.to][e.from] = -e.cost; cap[e.from][e.to] = e.cap; } void shortest_paths(int v0, vector<ll>& d, vector<int>& p) { d.assign(n, oo); d[v0] = 0; vector<bool> inq(n, false); queue<int> q; q.push(v0); p.assign(n, -1); while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = false; for (int v : adj[u]) { if (cap[u][v] > 0 && d[v] > d[u] + cost[u][v]) { d[v] = d[u] + cost[u][v]; p[v] = u; if (!inq[v]) { inq[v] = true; q.push(v); } } } } } ll min_cost_flow() { int flow = 0; ll cost = 0; vector<ll> d; vector<int> p; while (flow < k) { shortest_paths(s, d, p); if (d[t] == oo) break; int f = k - flow; int cur = t; while (cur != s) { f = min(f, cap[p[cur]][cur]); cur = p[cur]; } flow += f; cost += 1LL * f * d[t]; cur = t; while (cur != s) { cap[p[cur]][cur] -= f; cap[cur][p[cur]] += f; cur = p[cur]; } } if (flow < k) return -1; return cost; } }; const ll lim = 4000; int n, k; ll x; ll sum, ans; void Task() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(9); if (fopen(FNAME".inp","r")) { freopen(FNAME".inp","r",stdin); freopen(FNAME".out","w",stdout); } } void Solve() { //Your Code cin >> n >> k; MinFlow calc(n * n + 2, k, 0, n * n + 1); sum = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> x; sum += x; x = lim - x; int id = (i - 1) * n + j; if ((i + 1 + j) & 1) { calc.addEdge(Edge(0, id, 1, x)); if (i > 1) calc.addEdge(Edge(id, id - n, 1, 0)); if (j > 1) calc.addEdge(Edge(id, id - 1, 1, 0)); } else { calc.addEdge(Edge(id, n * n + 1, 1, x)); if (i > 1) calc.addEdge(Edge(id - n, id, 1, 0)); if (j > 1) calc.addEdge(Edge(id - 1, id, 1, 0)); } } } ans = calc.min_cost_flow(); cout << sum - 2LL * k * lim + ans << '\n'; } int main() { Task(); Solve(); cerr << "\nTime run: " << 1000*clock()/CLOCKS_PER_SEC << "ms"; return 37^37; }

Compilation message (stderr)

domino.cpp: In function 'void Task()':
domino.cpp:107:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |   freopen(FNAME".inp","r",stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
domino.cpp:108:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   freopen(FNAME".out","w",stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...