Submission #836044

#TimeUsernameProblemLanguageResultExecution timeMemory
836044tengiz05Catfish Farm (IOI22_fish)C++17
100 / 100
906 ms105320 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; using i64 = long long; constexpr int N = 3000; constexpr i64 inf = 1E18; void chmax(i64 &a, i64 b) { if (a < b) { a = b; } } long long max_weights(int n, int m, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { vector<vector<pair<int, int>>> a(n); vector<map<int, int>> f(n); for (int i = 0; i < m; i++) { f[X[i]][Y[i]] += W[i]; if (X[i] > 0) { f[X[i] - 1][Y[i]] += 0; } if (X[i] < n - 1) { f[X[i] + 1][Y[i]] += 0; } } for (int i = 0; i < n; i++) { for (auto [j, x] : f[i]) { a[i].push_back({j, x}); } } vector<vector<i64>> pre(n); vector<vector<array<i64, 2>>> dp(n); for (int i = 0; i < n; i++) { int k = a[i].size(); sort(a[i].begin(), a[i].end()); pre[i].resize(k + 1); for (int j = 0; j < k; j++) { pre[i][j + 1] = pre[i][j] + a[i][j].second; } dp[i].resize(k + 1, {-inf, -inf}); } for (int i = 0; i <= int(a[0].size()); i++) { dp[0][i][0] = dp[0][i][1] = 0; } for (int i = 1; i < n; i++) { i64 best = -inf; int sz = a[i].size(); int j = 0; for (int k = 0; k <= sz; k++) { while (j < int(dp[i - 1].size()) && ((j == 0 ? -1 : a[i - 1][j - 1].first) <= (k == 0 ? -1 : a[i][k - 1].first))) { chmax(best, dp[i - 1][j][0] - pre[i - 1][j]); j++; } // chmax(best, dp[i - 1][k][0] - pre[i - 1][k]); // if (i == 2) { // cout << best << " " << pre[i - 1][k] << " h\n"; // } if (k == 0) { chmax(dp[i][k][0], best); } else { int p = upper_bound(a[i - 1].begin(), a[i - 1].end(), pair<int, int>{a[i][k - 1].first, 2E9}) - a[i - 1].begin(); chmax(dp[i][k][0], best + pre[i - 1][p]); } } best = -inf; j = a[i - 1].size(); for (int k = sz; k >= 0; k--) { while (j >= 0 && ((j == 0 ? -1 : a[i - 1][j - 1].first) >= (k == 0 ? -1 : a[i][k - 1].first))) { if (j == 0) { chmax(best, dp[i - 1][j][1]); } else { int p = upper_bound(a[i].begin(), a[i].end(), pair<int, int>{a[i - 1][j - 1].first, 2E9}) - a[i].begin(); chmax(best, dp[i - 1][j][1] + pre[i][p]); } j--; } // if (i == 3) // cerr << "a " << k << " " << best << "\n"; // chmax(best, dp[i - 1][k][1] + pre[i][k]); if (k == 0) { chmax(dp[i][k][1], best); } else { chmax(dp[i][k][1], best - pre[i][k]); } } // cerr << "F\n"; if (i >= 2) { best = -inf; j = a[i - 2].size(); for (int k = sz; k >= 0; k--) { while (j >= 0 && ((j == 0 ? -1 : a[i - 2][j - 1].first) >= (k == 0 ? -1 : a[i][k - 1].first))) { if (j == 0) { chmax(best, dp[i - 2][j][1]); } else { int p = upper_bound(a[i - 1].begin(), a[i - 1].end(), pair<int, int>{a[i - 2][j - 1].first, 2E9}) - a[i - 1].begin(); chmax(best, dp[i - 2][j][1] + pre[i - 1][p]); } j--; } // chmax(best, dp[i - 2][k][1] + pre[i - 1][k]); chmax(dp[i][k][0], best); } best = -inf; j = 0; for (int k = 0; k <= sz; k++) { while (j < int(dp[i - 2].size()) && ((j == 0 ? -1 : a[i - 2][j - 1].first) <= (k == 0 ? -1 : a[i][k - 1].first))) { chmax(best, dp[i - 2][j][1]); j++; } // chmax(best, dp[i - 2][k][1]); if (k == 0) { chmax(dp[i][k][0], best); } else { int p = upper_bound(a[i - 1].begin(), a[i - 1].end(), pair<int, int>{a[i][k - 1].first, 2E9}) - a[i - 1].begin(); chmax(dp[i][k][0], best + pre[i - 1][p]); } } } // cerr << "D\n"; for (int j = 0; j <= sz; j++) { chmax(dp[i][j][1], dp[i][j][0]); } if (i + 1 < n) chmax(dp[i + 1][0][0], dp[i][0][1]); } // cout << dp[3][0][1] << "\n"; // cout << dp[3][1][1] << "\n"; i64 ans = 0; for (int i = 0; i <= int(a[n - 1].size()); i++) { ans = max(ans, dp[n - 1][i][1]); } return ans; }
#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...