Submission #971611

#TimeUsernameProblemLanguageResultExecution timeMemory
971611GasmaskChanNafta (COI15_nafta)C++17
100 / 100
279 ms88148 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define MAX 2007 const int dx[] = {1, 0, 0, -1}; const int dy[] = {0, 1, -1, 0}; char a[MAX][MAX]; bool visited[MAX][MAX]; int sum[MAX], val[MAX][MAX], f[MAX][MAX]; queue<pair<int, int>> q; vector<pair<int, int>> posi[MAX]; void dfs(int l, int r, int u, int v, int cur) { if (l > r) return; int mid = (l + r) >> 1, best = 0; for (int i = u; i <= min(v, mid); i++) if (f[cur - 1][i - 1] + val[i][mid] > f[cur][mid]) { f[cur][mid] = f[cur - 1][i - 1] + val[i][mid]; best = i; } dfs(l, mid - 1, u, best, cur); dfs(mid + 1, r, best, v, cur); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // freopen("test.in", "r", stdin); freopen("test.out", "w", stdout); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (a[i][j] != '.' && !visited[i][j]) { int l = j, r = j, s = 0; visited[i][j] = true; q.emplace(i, j); while (!q.empty()) { int u, v; tie(u, v) = q.front(); q.pop(); l = min(l, v), r = max(r, v); s += a[u][v] - 48; for (int x, y, k = 0; k < 4; k++) { x = u + dx[k], y = v + dy[k]; if (min(x, y) > 0 && x <= n && y <= m && a[x][y] != '.' && !visited[x][y]) { visited[x][y] = true; q.emplace(x, y); } } } posi[r].emplace_back(l, s); } for (int i = 1; i <= m; i++) { for (auto &[l, s] : posi[i]) for (int j = l; j <= i; j++) sum[j] += s; for (int j = 1; j <= i; j++) val[j][i] = sum[j]; } for (int k = 1; k <= m; k++) { dfs(1, m, 1, m, k); cout << f[k][m] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...