Submission #1234097

#TimeUsernameProblemLanguageResultExecution timeMemory
1234097dostsCatfish Farm (IOI22_fish)C++20
9 / 100
1098 ms41784 KiB
#include "fish.h" #include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define sp << " " << #define all(x) x.begin(),x.end() #define big(x) ((int)(x.size())) using namespace std; const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18; const int NN = 100001; int max_weights(signed N, signed M, vector<signed> X,vector<signed> Y, vector<signed> W) { //dp[top/bot][0]->dp[top/bot][1] 0 cost //dp[i][j][rising] --> max(dp[i-1][j'][rising]+w[i-1][h[j]]-w[i-1][h[j']]) //dp[i][j][fall] = max(dp[i-1][j'][fall]-w[i][h[j]]+w[i][h[j]-1]); //O(4*(M+N)*prefsm) for (int i = 0;i<M;i++) X[i]++,Y[i]++; vector<vector<pii>> dp(N+2); vector<pii> fishes[N+2]; vi pts[N+2]; for (int i=0;i<M;i++) fishes[X[i]].push_back({Y[i],W[i]}); pts[0].push_back(0); for (int i=1;i<=N+1;i++) { pts[i].push_back(0); if (i<N+1) for (auto it :fishes[i-1]) pts[i].push_back(it.ff); if(i<N+1)for (auto it :fishes[i+1]) pts[i].push_back(it.ff); if (i < N+1)pts[i].push_back(N); } for (int i=1;i<=N+1;i++) { sort(all(pts[i])); sort(all(fishes[i])); pts[i].erase(unique(all(pts[i])),pts[i].end()); } for (int i=0;i<=N+1;i++) dp[i].assign(big(pts[i]),pii{-inf,-inf}); dp[0][0] = {0,0}; vi done(N+2,0); auto getweights = [&](int col,int h) -> int { if (fishes[col].empty()) return 0; if (!done[col]) { int cur = 0; for (auto& [hei,wei] : fishes[col]) { wei+=cur; cur = wei; } done[col] = 1; } auto it = upper_bound(all(fishes[col]),pii{h,inf}); if (it == fishes[col].begin()) return 0; --it; return it->ss; }; for (int i=1;i<=N+1;i++) { for (int j=0;j<big(pts[i]);j++) { //bi önceki benden büyük (riyal) for (int jp = 0;jp<big(pts[i-1]) && pts[i-1][jp] <= pts[i][j];jp++) { dp[i][j].ff = max(dp[i][j].ff, dp[i-1][jp].ff+getweights(i-1,pts[i][j])-getweights(i-1,pts[i-1][jp])); } for (int jp = big(pts[i-1])-1;jp>=0 && pts[i-1][jp] >= pts[i][j];jp--) { dp[i][j].ss = max(dp[i][j].ss, dp[i-1][jp].ss-getweights(i,pts[i][j])+getweights(i,pts[i-1][jp])); } } if (i >= 2) { for (int j = 0;j<big(pts[i]);j++) { for (int jj = 0;jj<big(pts[i-2]);jj++) { dp[i][j].ss = max(dp[i][j].ss,dp[i-2][jj].ff+getweights(i,N)-getweights(i,pts[i][j])+ getweights(i-2,N)-getweights(i-2,pts[i-2][jj])); dp[i][j].ff = max(dp[i][j].ff,max(dp[i-2][jj].ff,dp[i-2][jj].ss)+ getweights(i-1,max(pts[i][j],pts[i-2][jj]))); } } } for (int j = 0;j<big(pts[i]);j++) { //cout << i sp pts[i][j] sp dp[i][j].ff sp dp[i][j].ss << '\n'; } } int ans = 0; for (pii itt : dp[N+1]) { ans = max(ans,itt.ff); ans = max(ans,itt.ss); } 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...