Submission #922394

#TimeUsernameProblemLanguageResultExecution timeMemory
922394LudisseyCatfish Farm (IOI22_fish)C++17
35 / 100
1086 ms2097152 KiB
#include "fish.h" #include <bits/stdc++.h> #define int long long using namespace std; vector<vector<int>> a; vector<vector<int>> fsh; vector<vector<int>> prfx; vector<vector<int>> possprfx; vector<vector<vector<int>>> dp; int N,M; long long max_weights(signed n, signed m, std::vector<signed> X, std::vector<signed> Y, std::vector<signed> W) { N=n; M=m; fsh.resize(N+1,vector<int>(1,0)); prfx.resize(N+1, vector<int>(N+1,0)); possprfx.resize(N+1, vector<int>(N+1,0)); dp.resize(N+1, vector<vector<int>>((N+1), vector<int>(3,0))); a.resize(N+1, vector<int>((N+1), 0)); for (int i = 0; i < M; i++){ a[X[i]][Y[i]] = W[i]; fsh[X[i]+1].push_back(Y[i]+1); if(X[i]>0) fsh[X[i]-1].push_back(Y[i]+1); } for (int i = 0; i < N; i++) sort(fsh[i].begin(),fsh[i].end()); // N log N for (int i = 0; i < N; i++) //N*N { for (int j = 0; j < N; j++) { prfx[i][j]=a[i][j]; if(j>0) prfx[i][j]+=prfx[i][j-1]; } } for (int i = 0; i < N; i++) //N*N { int mxIndx=-1; int mx=0; //decrease for (int j = 0; j < N; j++) { if(j>0) possprfx[i][j]=possprfx[i][j-1]; possprfx[i][j]-=a[i][j]; if(i<N-1) possprfx[i][j]+=a[i+1][j]; if(possprfx[i][j]>=mx) { mxIndx=j; mx=possprfx[i][j]; } } fsh[i].push_back(mxIndx+1); mxIndx=-1; mx=0; //increase for (int j = 0; j < N; j++) { if(j>0) possprfx[i][j]=possprfx[i][j-1]; if(i>0) possprfx[i][j]+=a[i-1][j]; if(possprfx[i][j]>mx) { mxIndx=j; mx=possprfx[i][j]; } } fsh[i].push_back(mxIndx+1); } int mx=0; for (int x = N-1; x >= 0; x--) // O(N) { for (int last = 0; last <= N; last++) // O(N) { if(x==0&&last>0) break; for (int big = 0; big <= 2; big++)// O(2) { for (auto i:fsh[x]) // O(N) { if(i>last&&big==0) continue; int c=0; if(i==0) { if(big!=2) c=dp[x+1][last][1+(last>0)]; else c=dp[x+1][0][1]; } else c+=dp[x+1][i][i>last]; if(i==0&&last>0) { if(big<2) c+=prfx[x][last-1]; } else if(last>i&&big<2) { c+=prfx[x][last-1]-prfx[x][i-1]; } else if(i>last&&x>0){ int ng=0; if(last>0) ng=prfx[x-1][last-1]; c+=prfx[x-1][i-1]-ng; } dp[x][last][big]=max(c, dp[x][last][big]); mx=max(dp[x][last][big],mx); } //cerr<<x << " " << last << " " << big << " = " << dp[x][last][big] << "\n"; } } } return mx; }
#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...