Submission #1263842

#TimeUsernameProblemLanguageResultExecution timeMemory
1263842LIANafta (COI15_nafta)C++17
100 / 100
363 ms118436 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<vector<ll>> dp, profit;

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 dc(ll l, ll r, ll optl, ll optr, ll k) {
  if (l > r)
    return;
  ll mid = (l + r) >> 1;

  pair<ll, ll> best = {0, -1};
  for (ll j = optl; j <= min(mid - 1, optr); ++j) {
    ll val = dp[j][k - 1] + profit[mid][j]; 
    if (val > best.first) {
      best = {val, j};
    }
  }
  dp[mid][k] = best.first;
  ll opt = best.second;

  dc(l, mid - 1, optl, opt, k);
  dc(mid + 1, r, opt, optr, k);
}

void calc_dp() {
  for (ll i = 1; i <= c; ++i)
    dp[i][1] = profit[i][0]; 

  for (ll k = 2; k <= c; ++k) {
    dc(1, c, 0, c - 1, k); 
  }
}
void build_profit() {
  vector<vector<pair<ll, ll>>> byR(c + 2);
  for (auto &t : ranges) {
    ll L = get<0>(t), R = get<1>(t), W = get<2>(t);
    byR[R].push_back({L, W});
  }

  vector<ll> add(c + 2, 0), pref(c + 2, 0);
  for (ll i = c; i >= 1; --i) {
    for (auto &pr : byR[i])
      add[pr.first] += pr.second;
    pref[0] = 0;
    for (ll x = 1; x <= c; ++x)
      pref[x] = pref[x - 1] + add[x];
    ll total_to_i = pref[i];
    for (ll j = 0; j < i; ++j) {
      profit[i][j] = total_to_i - pref[j];
    }
  }
}

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

  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});
      }
    }
  }

  build_profit();
  calc_dp();
  ll pref = 0;
  for (ll k = 1; k <= c; k++) {
    ll best = 0;
    for (ll i = 1; i <= c; i++)
      best = max(best, dp[i][k]);
    pref = max(pref, best);
    cout << pref << endl;
  }
}

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...