Submission #647191

#TimeUsernameProblemLanguageResultExecution timeMemory
647191danikoynovNafta (COI15_nafta)C++14
34 / 100
1097 ms50100 KiB
/** ____ ____ ____ ____ ____ ____ ||l |||e |||i |||n |||a |||d || ||__|||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\|/__\| **/ #include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } struct cell { int x, y; cell(int _x = 0, int _y = 0) { x = _x; y = _y; } cell operator + (const cell & c) const { cell r; r.x = x + c.x; r.y = y + c.y; return r; } }; cell neib[4] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; const int maxn = 2010; int n, m, sum[maxn * maxn], used[maxn][maxn]; int lm[maxn * maxn], rm[maxn * maxn], met[maxn * maxn]; char c[maxn][maxn]; void bfs(int i, int j) { cell st(i, j); queue < cell > q; q.push(st); while(!q.empty()) { st = q.front(); q.pop(); for (int i = 0; i < 4; i ++) { cell nb = st + neib[i]; if (!used[nb.x][nb.y]) { used[nb.x][nb.y] = used[st.x][st.y]; q.push(nb); } } } } int cost[maxn][maxn], df[maxn], dp[maxn][maxn]; void solve() { cin >> n >> m; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { cin >> c[i][j]; if (c[i][j] == '.') used[i][j] = 1; } for (int i = 0; i <= n + 1; i ++) used[i][0] = used[i][m + 1] = 1; for (int j = 0; j <= m + 1; j ++) used[0][j] = used[n + 1][j] = 1; int cnt = 0; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { if (!used[i][j]) { cnt ++; used[i][j] = cnt; bfs(i, j); } } for (int i = 1; i <= cnt; i ++) lm[i] = m + 1, rm[i] = 0; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { if (c[i][j] == '.') { used[i][j] = 0; continue; } sum[used[i][j]] += (int)(c[i][j] - '0'); lm[used[i][j]] = min(lm[used[i][j]], j); rm[used[i][j]] = max(rm[used[i][j]], j); } for (int j = 1; j <= m; j ++) { int cur = 0; for (int i = 1; i <= n; i ++) { if (!met[used[i][j]]) { met[used[i][j]] = 1; df[rm[used[i][j]]] += sum[used[i][j]]; cur += sum[used[i][j]]; } } for (int i = 1; i <= n; i ++) met[used[i][j]] = 0; for (int j1 = 0; j1 < j; j1 ++) cost[j1][j] += cur; int to_rem = cur - df[j]; for (int j1 = j + 1; j1 <= m; j1 ++) { cost[j][j1] -= to_rem; to_rem -= df[j1]; } for (int j1 = 1; j1 <= m; j1 ++) df[j1] = 0; } for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) for (int i1 = 0; i1 < i; i1 ++) { dp[i][j] = max(dp[i][j], dp[i1][j - 1] + cost[i1][i]); dp[i][j] = max(dp[i][j], dp[i - 1][j]); } for (int j = 1; j <= m; j ++) cout << dp[n][j] << endl; } int main() { solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...