제출 #1257898

#제출 시각아이디문제언어결과실행 시간메모리
1257898bbldrizzyNafta (COI15_nafta)C++20
100 / 100
437 ms100960 KiB
#include <bits/stdc++.h>
#include <ios>
#include <iostream>
#include <random>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define f first
#define s second
const int MOD = 1e9+7;
const ll inf = 4*1e18;
const int mx = 5*1e5+5;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int sum = 0;
int l = 1e9;
int R = 0;
int r, c; 
vector<vector<bool>> vis;
vector<vector<int>> cost;

bool inbounds(int x, int y) {
    return x >= 0 && x < r && y >= 0 && y < c;
}

void dfs(int x, int y, vector<vector<char>> &g) {
    vis[x][y] = true;
    sum += (g[x][y]-'0');
    l = min(l, y);
    R = max(R, y);
    for (int i = 0; i < 4; i++) {
        int xd = x+dx[i]; int yd = y+dy[i];
        if (inbounds(xd, yd) && !vis[xd][yd]) {
            dfs(xd, yd, g);
        }
    }
}

vector<vector<int>> dp;
void solve(ll id, ll i, ll j, ll le, ll ri) {
    if (i > j) return;
    ll mid = (i+j)/2;
    ll mn = 0;
    ll best = le;
    for (ll k = le; k <= min(mid, ri); k++) {
        ll v = dp[k-1][id-1] + cost[k-1][mid];
        if (v > mn) {
            best = k;
            mn = v;
        }
    }
    dp[mid][id] = mn;
    solve(id, i, mid-1, le, best);
    solve(id, mid+1, j, best, ri);
}

int main() {
    cin >> r >> c;
    vector<vector<char>> g(r, vector<char>(c, '.'));
    vis.resize(r, vector<bool>(c));
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            char c; cin >> c;
            g[i][j] = c;
            if (g[i][j] == '.') vis[i][j] = true;
        }
    }
    vector<vector<pair<int, int>>> start(c+1);
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (!vis[i][j]) {
                // cout << "i, j: " << i << ", " << j << "\n";
                sum = 0;
                l = 1e9;
                R = 0;
                dfs(i, j, g);
                start[R+1].push_back({l+1, sum});
                // cout << "l, R, sum: " << l <<  ", " << R << ", " << sum << "\n";
            }
        }
    }
    cost.resize(c+1, vector<int>(c+1));
    vector<int> W(c+1, 0);
    for (int rr = 1; rr <= c; ++rr) {
        for (auto &pr : start[rr]) {
            W[pr.first] += pr.second;
        }
    }
    vector<int> P(c+1, 0);
    for (int j = 1; j <= c; j++) {
        P[0] = 0;
        for (int x = 1; x <= c; x++) P[x] = P[x-1]+W[x];
        for (int i = 0; i < j; i++) {
            cost[i][j] = P[j]-P[i];
        }
        for (auto &pr: start[j]) {
            W[pr.first] -= pr.second;
        }
    }
    dp.assign(c+1, vector<int>(c+1));
    int mx = 0;
    for (int i = 1; i <= c; i++) {
        dp[i][1] = cost[0][i];
        mx = max(dp[i][1], mx);
        // cout << dp[i][1] << "\n";
    }
    cout << mx << "\n";
    for (int i = 2; i <= c; i++) {
        solve(i, 1, c, 1, c);
        mx = 0;
        for (int j = 1; j <= c; j++) {
            mx = max(mx, dp[j][i]);
        }
        cout << mx << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...