Submission #1263655

#TimeUsernameProblemLanguageResultExecution timeMemory
1263655LIANafta (COI15_nafta)C++17
34 / 100
1099 ms83624 KiB
#include <bits/stdc++.h>
#define ll long long
const ll inf = 1e19 + 7;
using namespace std;

ll r, c, n;
vector<string> grid;
vector<pair<ll, ll>> dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
vector<vector<bool>> vis;
vector<tuple<ll, ll, ll>> ranges;
vector<ll> pref;
bool lol(ll i, ll j) {
  return (i >= 1 && j >= 1 && i <= r && j <= c && !vis[i][j] &&
          grid[i][j - 1] != '.');
}

ll lf, ri, sum = 0;
void dfs(ll i, ll j) {
  lf = min(lf, j);
  ri = max(ri, j);
  vis[i][j] = 1;
  sum += (grid[i][j - 1] - '0');
  for (auto [x, y] : dir) {
    if (lol(i + x, j + y))
      dfs(i + x, j + y);
  }
}

void proc_dp() {
  vector<vector<ll>> add(c + 2, vector<ll>(c + 2, 0));
  for (auto [L, R, W] : ranges) {
    if (L < 1)
      L = 1;
    if (R > c)
      R = c;
    if (L > R)
      continue;
    add[L][R] += W;
  }

  vector<vector<ll>> suf(c + 2, vector<ll>(c + 3, 0));
  for (ll L = 1; L <= c; ++L)
    for (ll x = c; x >= 1; --x)
      suf[L][x] = suf[L][x + 1] + add[L][x];

  vector<ll> ans(c + 1, 0);
  vector<ll> dp_prev(c + 1, 0), dp_cur(c + 1, 0);

  for (ll t = 1; t <= c; ++t) {
    fill(dp_cur.begin(), dp_cur.end(), 0);
    ll best_over_i = 0;
    for (ll i = 1; i <= c; ++i) {
      ll acc = 0, best = 0;
      for (ll k = i; k >= 1; --k) {
        acc += suf[k][i];
        best = max(best, dp_prev[k - 1] + acc);
      }
      dp_cur[i] = best;
      best_over_i = max(best_over_i, best);
    }
    ans[t] = max(ans[t - 1], best_over_i);
    dp_prev.swap(dp_cur);
  }

  for (ll k = 1; k <= c; ++k)
    cout << ans[k] << "\n";
}

int main() {
  cin >> r >> c;
  grid.resize(r + 1);
  vis.resize(r + 1, vector<bool>(c + 1));

  for (ll i = 1; i <= r; ++i) {
    cin >> grid[i];
  }

  for (ll i = 1; i <= r; ++i) {
    for (ll j = 1; j <= c; ++j) {
      if (lol(i, j)) {
        lf = inf, ri = -1, sum = 0;
        dfs(i, j);
        ranges.push_back({lf, ri, sum});
      }
    }
  }
  proc_dp();
  vector<ll> ans(c + 1);
}

Compilation message (stderr)

nafta.cpp:3:21: warning: overflow in conversion from 'double' to 'long long int' changes value from '1.0e+19' to '9223372036854775807' [-Woverflow]
    3 | const ll inf = 1e19 + 7;
      |                ~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...