Submission #1239349

#TimeUsernameProblemLanguageResultExecution timeMemory
1239349Hamed_GhaffariCatfish Farm (IOI22_fish)C++20
100 / 100
133 ms37984 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; using ll = long long; #define SZ(x) int(x.size()) #define maxs(a, b) (a = max(a, b)) const int MXN = 1e5+5; const ll inf = 1e18; vector<int> vec[MXN]; vector<ll> dp[3][MXN]; ll max_weights(int n, int m, vector<int> X, vector<int> Y, vector<int> W) { for(int i=0; i<m; i++) vec[++X[i]].push_back(i); Y.push_back(0); W.push_back(0); Y.push_back(n); W.push_back(0); for(int i=0; i<=n; i++) { vec[i].push_back(m); if(i) vec[i].push_back(m+1); sort(vec[i].begin(), vec[i].end(), [&](int x, int y) { return Y[x]<Y[y]; }); if(i) { dp[0][i].resize(SZ(vec[i-1]), i==1 ? 0 : -inf); for(int t : {1, 2}) dp[t][i].resize(SZ(vec[i]), i==1 ? 0 : -inf); } } for(int i=2; i<=n; i++) { maxs(dp[0][i][0], *max_element(dp[0][i-1].begin(), dp[0][i-1].end())); // .. 0 0 int ptr=0; ll sum=0; for(int j=0; j<SZ(vec[i-1]); j++) { while(ptr<SZ(vec[i]) && Y[vec[i][ptr]]<Y[vec[i-1][j]]) sum += W[vec[i][ptr++]]; maxs(dp[0][i][j], max(dp[1][i-1][j], dp[2][i-1][j])+sum); } // .. x 0 ptr = SZ(vec[i-2])-1; ll mx = -inf; for(int j=SZ(vec[i])-1; j>=0; j--) { while(ptr>=0 && Y[vec[i-2][ptr]]>=Y[vec[i][j]]) maxs(mx, dp[0][i-1][ptr--]); maxs(dp[1][i][j], mx); maxs(dp[2][i][j], mx); } // x 0 y (x>=y) ptr=0, sum=0, mx = -inf; int ptr2=0, ptr3=0; ll sum2 = 0; for(int j=0; j<SZ(vec[i]); j++) { while(ptr<SZ(vec[i-2]) && Y[vec[i-2][ptr]]<=Y[vec[i][j]]) { while(ptr2<SZ(vec[i-1]) && Y[vec[i-1][ptr2]]<Y[vec[i-2][ptr]]) sum2 += W[vec[i-1][ptr2++]]; maxs(mx, dp[0][i-1][ptr++]-sum2); } while(ptr3<SZ(vec[i-1]) && Y[vec[i-1][ptr3]]<Y[vec[i][j]]) sum += W[vec[i-1][ptr3++]]; maxs(dp[1][i][j], mx+sum); maxs(dp[2][i][j], mx+sum); } // x 0 y (x<=y) ptr=0, sum=0; ptr2=0; mx = -inf, sum2=0; for(int j=0; j<SZ(vec[i]); j++) { while(ptr<SZ(vec[i-1]) && Y[vec[i-1][ptr]]<Y[vec[i][j]]) sum += W[vec[i-1][ptr++]]; while(ptr2<SZ(vec[i-1]) && Y[vec[i-1][ptr2]]<=Y[vec[i][j]]) { maxs(mx, dp[1][i-1][ptr2]-sum2); sum2 += W[vec[i-1][ptr2++]]; } maxs(dp[1][i][j], mx+sum); maxs(dp[2][i][j], mx+sum); } // x y (x<=y) ptr=SZ(vec[i-1])-1; mx = -inf; sum = 0; ptr2=SZ(vec[i])-1; sum2=0; for(int j=SZ(vec[i])-1; j>=0; j--) { while(ptr>=0 && Y[vec[i-1][ptr]]>=Y[vec[i][j]]) { while(ptr2>=0 && Y[vec[i][ptr2]]>=Y[vec[i-1][ptr]]) sum2 += W[vec[i][ptr2--]]; maxs(mx, dp[2][i-1][ptr--]-sum2); } sum += W[vec[i][j]]; maxs(dp[2][i][j], mx+sum); } // x y (x>=y) } return max({ *max_element(dp[0][n].begin(), dp[0][n].end()), *max_element(dp[1][n].begin(), dp[1][n].end()), *max_element(dp[2][n].begin(), dp[2][n].end()) }); }
#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...