Submission #1129117

#TimeUsernameProblemLanguageResultExecution timeMemory
1129117vladiliusCatfish Farm (IOI22_fish)C++20
100 / 100
287 ms52388 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; #define pb push_back #define ff first #define ss second const ll infm = -1e18; ll max_weights(int N, int M, vector<int> X, vector<int> Y, vector<int> W){ int n = N, m = M; for (int i = 0; i < m; i++){ X[i]++; Y[i]++; } vector<int> dy[n + 1]; vector<pii> d[n + 1]; for (int i = 0; i < m; i++){ d[X[i]].pb({Y[i], i}); } vector<ll> pr[n + 1]; for (int i = 1; i <= n; i++){ sort(d[i].begin(), d[i].end()); pr[i].resize(d[i].size() + 1); for (int j = 1; j <= d[i].size(); j++){ pr[i][j] = pr[i][j - 1] + W[d[i][j - 1].ss]; dy[i].pb(d[i][j - 1].ff); } dy[i].pb(n + 1); } vector<int> :: iterator it; auto F = [&](int i, int j){ it = upper_bound(dy[i].begin(), dy[i].end(), j); int t = (int) (it - dy[i].begin()); return pr[i][t]; }; vector<ll> dp[n + 1][2]; vector<int> ii[n + 1]; dp[1][0].pb(0); dp[1][1].pb(0); ii[1].pb(0); dp[1][0].pb(0); dp[1][1].pb(0); ii[1].pb(n); for (int i = 2; i <= n; i++){ int a = (int) dp[i - 1][0].size(); vector<ll> pr1(a + 1); pr1[0] = infm; for (int j = 1; j <= a; j++){ pr1[j] = max(pr1[j - 1], dp[i - 1][0][j - 1] - F(i - 1, ii[i - 1][j - 1])); } vector<ll> pr4(a + 2); for (int j = a; j > 0; j--){ pr4[j] = max(pr4[j + 1], max(dp[i - 1][0][j - 1], dp[i - 1][1][j - 1]) + F(i, ii[i - 1][j - 1])); } a = (int) dp[i - 2][0].size(); vector<ll> pr2(a + 1), pr3(a + 2); if (i > 2){ for (int j = 1; j <= a; j++){ pr2[j] = max(pr2[j - 1], max(dp[i - 2][0][j - 1], dp[i - 2][1][j - 1])); } for (int j = a; j > 0; j--){ pr3[j] = max(pr3[j + 1], max(dp[i - 2][0][j - 1], dp[i - 2][1][j - 1]) + F(i - 1, ii[i - 2][j - 1])); } } for (int x: dy[i]){ int j = x - 1; ll a, b; it = upper_bound(ii[i - 1].begin(), ii[i - 1].end(), j); int t = (int) (it - ii[i - 1].begin()); a = pr1[t] + F(i - 1, j); b = max(0LL, pr4[t + 1] - F(i, j)); if (i > 2){ it = upper_bound(ii[i - 2].begin(), ii[i - 2].end(), j); int t = (int) (it - ii[i - 2].begin()); a = max({a, pr2[t] + F(i - 1, j), pr3[t + 1]}); } dp[i][0].pb(a); dp[i][1].pb(b); ii[i].pb(j); } if (ii[i][0]){ dp[i][0].insert(dp[i][0].begin(), 0); dp[i][1].insert(dp[i][1].begin(), 0); ii[i].insert(ii[i].begin(), 0); } } ll out = 0; for (int i = 1; i <= n; i++){ for (ll j: dp[i][0]){ out = max(out, j); } for (ll j: dp[i][1]){ out = max(out, j); } } return out; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...