Submission #1286603

#TimeUsernameProblemLanguageResultExecution timeMemory
1286603julia_08Nafta (COI15_nafta)C++20
100 / 100
257 ms122168 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e3 + 10; int marc[MAXN][MAXN], cnt[MAXN][MAXN], sum[MAXN][MAXN]; int dp[MAXN][MAXN]; char a[MAXN][MAXN]; int n, m; int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0}; bool check(int x, int y){ return 0 < x && x <= n && 0 < y && y <= m && a[x][y] != '.'; } void dfs(int x, int y, int &l, int &r, int &cur){ marc[x][y] = 1; l = min(l, y); r = max(r, y); cur += a[x][y] - '0'; for(int k=0; k<4; k++){ int nx = x + dx[k], ny = y + dy[k]; if(!check(nx, ny) || marc[nx][ny]) continue; dfs(nx, ny, l, r, cur); } } void compute(int k, int l, int r, int opt_l, int opt_r){ if(l > r) return; int m = (l + r) / 2; pair<int, int> best = {0, 0}; for(int i=opt_l; i<=min(m - 1, opt_r); i++) best = max(best, {dp[k - 1][i] + sum[i][m], i}); dp[k][m] = best.first; compute(k, l, m - 1, opt_l, best.second); compute(k, m + 1, r, best.second, opt_r); } int main(){ cin.tie(0)->sync_with_stdio(0); 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(marc[i][j] || a[i][j] == '.') continue; int l = j, r = j, cur = 0; dfs(i, j, l, r, cur); cnt[l][l] += cur; cnt[l][r + 1] -= cur; } } for(int i=1; i<=m; i++){ for(int j=1; j<=m; j++){ cnt[i][j] += cnt[i][j - 1]; } } for(int i=m; i>=0; i--){ for(int j=i; j<=m; j++){ sum[i][j] = sum[i + 1][j] + cnt[i + 1][j]; } } for(int k=1; k<=m; k++){ compute(k, 1, m, 0, m); int ans = 0; for(int i=1; i<=m; i++) ans = max(ans, dp[k][i]); cout << ans << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...