Submission #628267

#TimeUsernameProblemLanguageResultExecution timeMemory
628267600MihneaCatfish Farm (IOI22_fish)C++17
37 / 100
1096 ms68544 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; void maxup(ll &a, ll b) { a = max(a, b); } long long max_weights(int n, int cnt_fish, std::vector<int> XX, std::vector<int> YY, std::vector<int> WW) { n += 7; vector<set<int>> interestingSet(n); vector<vector<int>> interesting(n); vector<vector<vector<ll>>> dp(2, vector<vector<ll>> (n)); vector<vector<ll>> both(n); vector<ll> dp_zero(n, 0LL); vector<vector<pair<int, ll>>> pe(n); assert((int) XX.size() == cnt_fish); assert((int) YY.size() == cnt_fish); assert((int) WW.size() == cnt_fish); for (int i = 0; i < cnt_fish; i++) { int x = XX[i] + 5, y = YY[i] + 1, w = WW[i]; pe[x].push_back({y, w}); vector<int> xs = {x - 1, x + 1}; for (auto &i : xs) { interestingSet[i].insert(y); } } for (int x = 0; x < n; x++) { interestingSet[x].insert(0); for (auto &y : interestingSet[x]) { interesting[x].push_back(y); } dp[0][x].resize((int) interesting[x].size(), 0LL); dp[1][x].resize((int) interesting[x].size(), 0LL); both[x].resize((int) interesting[x].size(), 0LL); sort(pe[x].begin(), pe[x].end()); ll sum = 0; for (auto &it : pe[x]) { sum += it.second; it.second = sum; } } function<ll(int, int)> get = [&] (int x, int y) { if (x == n) { return 0LL; } assert(0 <= x && x < n); assert(0 <= y && y < n); ll sol = 0; int low = 0, high = (int) pe[x].size() - 1; while (low <= high) { int mid = (low + high) / 2; if (pe[x][mid].first <= y) { sol = pe[x][mid].second; low = mid + 1; } else { high = mid - 1; } } return sol; }; for (int i = 5; i < n - 2; i++) { { maxup(dp_zero[i], dp_zero[i - 1]); for (int ant_j = 0; ant_j < (int) interesting[i - 1].size(); ant_j++) { int h2 = interesting[i - 1][ant_j]; maxup(dp_zero[i], both[i - 1][ant_j]); } } { int q = 0, w = 0; for (int j = 0; j < (int) interesting[i].size(); j++) { int h = interesting[i][j]; while (q < (int) interesting[i - 2].size() && interesting[i - 2][q] < h) { q++; } while (w < (int) interesting[i - 1].size() && interesting[i - 1][w] < h) { w++; } ll dp_ant0 = 0; maxup(dp_ant0, dp_zero[i - 2] + get(i - 1, h) + get(i + 1, h)); for (int ant_j = 0; ant_j < (int) interesting[i - 2].size(); ant_j++) { int h2 = interesting[i - 2][ant_j]; if (h2 >= h) { assert(ant_j >= q); maxup(dp_ant0, both[i - 2][ant_j] + (get(i - 1, h) - get(i - 1, h2)) + get(i + 1, h)); } else { assert(ant_j < q); maxup(dp_ant0, both[i - 2][ant_j] + get(i + 1, h)); } } maxup(dp[0][i][j], dp_ant0); maxup(dp[1][i][j], dp_ant0); for (int ant_j = 0; ant_j < (int) interesting[i - 1].size(); ant_j++) { int h2 = interesting[i - 1][ant_j]; if (h2 >= h) { assert(ant_j >= w); maxup(dp[0][i][j], both[i - 1][ant_j] - get(i, h) + get(i + 1, h)); } else { assert(ant_j < w); maxup(dp[1][i][j], dp[1][i - 1][ant_j] - get(i, h2) + (get(i - 1, h) - get(i - 1, h2)) + get(i + 1, h)); } } both[i][j] = max(dp[0][i][j], dp[1][i][j]); } } } ll sol = 0; for (int i = 0; i < n; i++) { maxup(sol, dp_zero[i]); for (int j = 0; j < (int) interesting[i].size(); j++) { maxup(sol, both[i][j]); } } return sol; }

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:81:13: warning: unused variable 'h2' [-Wunused-variable]
   81 |         int h2 = interesting[i - 1][ant_j];
      |             ^~
#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...