Submission #628303

#TimeUsernameProblemLanguageResultExecution timeMemory
628303600MihneaCatfish Farm (IOI22_fish)C++17
58 / 100
1094 ms68408 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) { const ll inf = (ll) 1e18 + 7; 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]); } } { vector<ll> dp_ant0((int) interesting[i].size()); { int q = 0, w = 0; ll Fpref = -inf, Spref = -inf; 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) { maxup(Fpref, both[i - 2][q]); q++; } while (w < (int) interesting[i - 1].size() && interesting[i - 1][w] < h) { int h2 = interesting[i - 1][w]; maxup(Spref, dp[1][i - 1][w] - get(i, h2) - get(i - 1, h2)); w++; } maxup(dp_ant0[j], Fpref + get(i + 1, h)); maxup(dp_ant0[j], dp_zero[i - 2] + get(i - 1, h) + get(i + 1, h)); maxup(dp[1][i][j], Spref + get(i - 1, h) + get(i + 1, h)); } } { int q = (int) interesting[i - 2].size(), w = (int) interesting[i - 1].size(); ll Fsuf = -inf, Sus = -inf; for (int j = (int) interesting[i].size() - 1; j >= 0; j--) { int h = interesting[i][j]; while (q - 1 >= 0 && interesting[i - 2][q - 1] >= h) { q--; } while (w - 1 >= 0 && interesting[i - 1][w - 1] >= h) { w--; } ll yy = -inf; for (int ant_j = q; ant_j < (int) interesting[i - 2].size(); ant_j++) { int h2 = interesting[i - 2][ant_j]; maxup(yy, both[i - 2][ant_j] + - get(i - 1, h2)); } maxup(dp_ant0[j], yy + get(i - 1, h) + get(i + 1, h)); yy = -inf; for (int ant_j = w; ant_j < (int) interesting[i - 1].size(); ant_j++) { maxup(yy, both[i - 1][ant_j]); } maxup(dp[0][i][j], yy - get(i, h) + get(i + 1, h)); } } for (int j = 0; j < (int) interesting[i].size(); j++) { maxup(dp[0][i][j], dp_ant0[j]); maxup(dp[1][i][j], dp_ant0[j]); 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:82:13: warning: unused variable 'h2' [-Wunused-variable]
   82 |         int h2 = interesting[i - 1][ant_j];
      |             ^~
fish.cpp:109:12: warning: unused variable 'Fsuf' [-Wunused-variable]
  109 |         ll Fsuf = -inf, Sus = -inf;
      |            ^~~~
fish.cpp:109:25: warning: unused variable 'Sus' [-Wunused-variable]
  109 |         ll Fsuf = -inf, Sus = -inf;
      |                         ^~~
#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...