제출 #852321

#제출 시각아이디문제언어결과실행 시간메모리
852321vjudge1Nafta (COI15_nafta)C++17
100 / 100
364 ms103228 KiB
#include <iostream>
#include <vector>
using namespace std;
int n, m, a[2005][2005], dd[2005][2005], f[2005][2005], ma = 0, mi = 999999999, c = 0;
int d[2005], res[2005], ff[2005][2005];
vector<pair<int, int>> g[2005];
void dfs(int x, int y) {
    if (x < 1 || y < 1 || x > n || y > m || a[x][y] == -1 || dd[x][y] == 1) return;
    dd[x][y] = 1;
    ma = max(ma, y);
    mi = min(mi, y);
    c += a[x][y];
    dfs(x - 1, y);
    dfs(x + 1, y);
    dfs(x, y - 1);
    dfs(x, y + 1);
}
void solve(int k, int l, int r, int x, int y) {
    if (l > r) return;
    int mid = (l + r) / 2, ma = 0, h = 0;
    for (int i = x; i <= min(mid, y); i++) {
        if (f[i][k - 1] - ff[i][mid] >= ma) {
            ma = f[i][k - 1] - ff[i][mid];
            h = i;
        }
    }
    f[mid][k] = ma + f[mid][1];
    res[k] = max(res[k], f[mid][k]);
    solve(k, l, mid - 1, x, h);
    solve(k, mid + 1, r, h, y);
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            char x;
            cin >> x;
            if (x == '.') a[i][j] = -1;
            else a[i][j] = x - '0';
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (dd[i][j] == 0 && a[i][j] != -1) {
                c = ma = 0;
                mi = 999999999;
                dfs(i, j);
                g[mi].push_back({mi, c});
                g[ma + 1].push_back({mi, -c});
                for (int k = mi; k <= ma; k++) {
                    f[k][1] += c;
                    res[1] = max(res[1], f[k][1]);
                }
            }
        }
    }
    for (int i = 1; i <= m; i++) {
        for (auto w : g[i]) {
            d[w.first] += w.second;
        }
        int h = 0;
        for (int j = 1; j <= i; j++) {
            h += d[j];
            ff[j][i] = h;
        }
    }
    cout << res[1] << '\n';
    for (int i = 2; i <= m; i++) {
        solve(i, 1, n, 1, n);
        cout << res[i] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...