Submission #1263824

#TimeUsernameProblemLanguageResultExecution timeMemory
1263824LIANafta (COI15_nafta)C++17
34 / 100
1094 ms339008 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>> Ls(c + 2), PS(c + 2); for (ll i = 1; i <= c; ++i) { vector<pair<ll, ll>> tmp; tmp.reserve(ranges.size()); for (auto [L, R, W] : ranges) { if (R >= i) tmp.push_back({L, W}); } sort(tmp.begin(), tmp.end(), [](const pair<ll, ll> &a, const pair<ll, ll> &b) { return a.first < b.first; }); Ls[i].resize(tmp.size()); PS[i].resize(tmp.size()); ll s = 0; for (size_t t = 0; t < tmp.size(); ++t) { Ls[i][t] = tmp[t].first; s += tmp[t].second; PS[i][t] = s; } } auto sum_leq = [&](const vector<ll> &Lvec, const vector<ll> &pref, ll x) -> ll { if (Lvec.empty()) return 0; auto it = upper_bound(Lvec.begin(), Lvec.end(), x); if (it == Lvec.begin()) return 0; size_t idx = size_t(it - Lvec.begin() - 1); return pref[idx]; }; vector<vector<ll>> dp(c + 1, vector<ll>(c + 1, 0)); for (ll t = 1; t <= c; ++t) { for (ll i = 1; i <= c; ++i) { ll best = 0; ll total_to_i = sum_leq(Ls[i], PS[i], i); for (ll k = 0; k < i; ++k) { ll total_to_k = sum_leq(Ls[i], PS[i], k); ll gain = total_to_i - total_to_k; best = max(best, dp[t - 1][k] + gain); } dp[t][i] = best; } } ll pref_ans = 0; for (ll t = 1; t <= c; ++t) { ll best = 0; for (ll i = 1; i <= c; ++i) best = max(best, dp[t][i]); pref_ans = max(pref_ans, best); cout << pref_ans << "\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(); }

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