Submission #1235028

#TimeUsernameProblemLanguageResultExecution timeMemory
1235028AMnuCatfish Farm (IOI22_fish)C++20
100 / 100
149 ms33308 KiB
#include "fish.h" #include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 1e5+5; struct dp { int pos; ll val, inc, dec; }; vector <dp> F[MAXN]; bool cmp(dp x,dp y) { if (x.pos != y.pos) return x.pos < y.pos; return x.val < y.val; } ll max_weights(int N,int M,vector<int> X,vector<int> Y,vector<int> W) { for (int i=0;i<M;i++) { F[X[i]].push_back({Y[i],W[i],0,0}); } for (int i=0;i<N;i++) { F[i].push_back({0,0}); F[i].push_back({N,0}); sort(F[i].begin(),F[i].end(),cmp); for (int j=1;j<(int)F[i].size();j++) { F[i][j].val += F[i][j-1].val; } for (int j=F[i].size()-1;j>0;j--) { F[i][j].val = F[i][j-1].val; } } for (int i=1;i<N;i++) { for (int j=0,k=0;j<(int)F[i].size();j++) { while (k < (int)F[i-1].size() && F[i-1][k].pos <= F[i][j].pos) { F[i][j].inc = max(F[i][j].inc, F[i-1][k].inc - F[i-1][k].val); k++; } if (j+1<(int)F[i].size()) { F[i][j+1].inc = F[i][j].inc; } } for (int j=0,jj=0;j<(int)F[i].size();j++) { while (F[i-1][jj].pos < F[i][j].pos) jj++; F[i][j].inc += F[i-1][jj].val; } for (int j=F[i].size()-1,k=F[i-1].size()-1,kk=F[i].size()-1;j>=0;j--) { while (k >= 0 && F[i-1][k].pos >= F[i][j].pos) { while (kk && F[i][kk-1].pos >= F[i-1][k].pos) kk--; F[i][j].dec = max(F[i][j].dec, max(F[i-1][k].dec,F[i-1][k].inc) + F[i][kk].val); k--; } if (j) { F[i][j-1].dec = F[i][j].dec; } } for (int j=0;j<(int)F[i].size();j++) { F[i][j].dec -= F[i][j].val; } if (i < 2) continue; ll opt = 0; for (int j=F[i].size()-1,k=F[i-2].size()-1,kk=F[i-1].size()-1;j>=0;j--) { while (k >= 0 && F[i-2][k].pos >= F[i][j].pos) { while (kk && F[i-1][kk-1].pos >= F[i-2][k].pos) kk--; opt = max(opt, max(F[i-2][k].inc,F[i-2][k].dec) + F[i-1][kk].val); k--; } F[i][j].inc = max(F[i][j].inc,opt); } opt = 0; for (int j=0,jj=0,k=0;j<(int)F[i].size();j++) { while (F[i-1][jj].pos < F[i][j].pos) jj++; while (k < (int)F[i-2].size() && F[i-2][k].pos <= F[i][j].pos) { opt = max(opt,max(F[i-2][k].inc,F[i-2][k].dec)); k++; } F[i][j].inc = max(F[i][j].inc, opt + F[i-1][jj].val); } } ll ans = 0; for (dp x : F[N-1]) { ans = max(ans,max(x.inc,x.dec)); } 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...