Submission #633171

#TimeUsernameProblemLanguageResultExecution timeMemory
633171JeanBombeurCatfish Farm (IOI22_fish)C++17
100 / 100
209 ms43196 KiB
#include "fish.h" #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; // <|°_°|> // M. Broccoli // The hardest choices require the strongest wills // What is better - to be born good, or to overcome your evil nature with great effort ? const int MAX_ROWS = (1e5 + 1); vector <long long> DP_Built[MAX_ROWS]; vector <long long> DP_Free[MAX_ROWS]; vector <pair <int, long long>> CatFishs[MAX_ROWS]; long long max_weights(int nbRows, int nbCatfishs, vector <int> Col, vector <int> Row, vector <int> Weight) { for (int i = 0; i < nbCatfishs; i ++) { CatFishs[Col[i] + 1].push_back({Row[i], Weight[i]}); } for (int i = 0; i <= nbRows; i ++) { CatFishs[i].push_back({-1, 0}); if (i) CatFishs[i].push_back({MAX_ROWS, 0}); sort(CatFishs[i].begin(), CatFishs[i].end()); DP_Built[i].resize(CatFishs[i].size()); DP_Free[i].resize(CatFishs[i].size()); } DP_Built[0] = {0}; DP_Free[0] = {0}; for (int i = 1; i <= nbRows; i ++) { long long maxiFree = - (1LL << 60); long long maxiBuilt = - (1LL << 60); int prev = 0; int sz = CatFishs[i - 1].size(); int curSz = CatFishs[i].size(); for (int fish = 0; fish < curSz - 1; fish ++) { while (prev < sz && CatFishs[i - 1][prev].first < CatFishs[i][fish + 1].first) { maxiBuilt = max(maxiBuilt, DP_Built[i - 1][prev]); maxiFree = max(maxiFree, DP_Free[i - 1][prev]); maxiFree += CatFishs[i - 1][prev ++].second; } DP_Built[i][fish] = max(maxiBuilt, maxiFree); DP_Free[i][fish + 1] = max(maxiBuilt, maxiFree); } maxiBuilt = - (1LL << 60); prev = sz - 1; for (int fish = curSz - 2; fish >= 0; fish --) { while (prev && CatFishs[i - 1][prev].first > CatFishs[i][fish + 1].first) maxiBuilt = max(maxiBuilt, DP_Built[i - 1][-- prev]); maxiBuilt += CatFishs[i][fish + 1].second; DP_Built[i][fish] = max(DP_Built[i][fish], maxiBuilt); } prev = 1; maxiFree = 0; for (int fish = 1; fish < curSz; fish ++) { maxiBuilt = - (1LL << 60); while (prev < sz && CatFishs[i - 1][prev + 1].first <= CatFishs[i][fish].first) maxiBuilt = max(maxiBuilt, DP_Built[i - 1][prev ++]); maxiFree += CatFishs[i][fish - 1].second; DP_Free[i][fish] = max(DP_Free[i][fish], maxiBuilt + maxiFree); } } long long ans = 0; for (long long a : DP_Built[nbRows]) ans = max(ans, a); 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...