Submission #873624

#TimeUsernameProblemLanguageResultExecution timeMemory
873624Nonoze메기 농장 (IOI22_fish)C++17
46 / 100
1002 ms192340 KiB
#include "fish.h" //#include "grader.cpp" #include <bits/stdc++.h> using namespace std; #define int long long unordered_map<int, unordered_map<int, unordered_map<int,int>>> memo; vector<vector<pair<int, int>>> values; int n; int mini=0; int dp(int empl, int take, int pretake) { if (empl>=n) return 0; if (memo[empl][take].count(pretake)) return memo[empl][take][pretake]; int ans=dp(empl+1, 0, take); int sum=0; int empl1=0, empl2=0, empl3=0; int sz1=(empl?values[empl-1].size():0), sz2=values[empl].size(), sz3=(empl+1<n?values[empl+1].size():0); while (empl1<sz1 || empl2<sz2 || empl3<sz3) { int i=LLONG_MAX, indice=1; if (empl2<sz2 && values[empl][empl2].first<i) { i=values[empl][empl2].first; indice=2; } if (empl1<sz1 && values[empl-1][empl1].first<i) { i=values[empl-1][empl1].first; indice=1; } if (empl3<sz3 && values[empl+1][empl3].first<i) { i=values[empl+1][empl3].first; indice=3; } if (indice==1) { if (pretake<i+1 && take<i+1) { sum+=values[empl-1][empl1].second; ans=max(ans, dp(empl+1, i+1, take)+sum); } empl1++; } else if (indice==2) { if (take>=i+1) { sum-=values[empl][empl2].second; } empl2++; } else { sum+=values[empl+1][empl3].second; ans=max(ans, dp(empl+1, i+1, take)+sum); empl3++; } } return memo[empl][take][pretake]=ans; } #undef int long long max_weights(int N, int m, vector<int> x, vector<int> y, vector<int> w) { #define int long long n=N; bool tacha=true, tachb=true; for (int i = 0; i < m; ++i) { if (x[i]%2) tacha=false; if (x[i]>1) tachb=false; } if (tacha) { int ans=0; for (int i = 0; i < m; ++i) ans+=w[i]; return ans; } if (tachb) { vector<vector<int>> farm(2, vector<int> (n, 0)); for (int i=0; i<m; i++) { farm[x[i]][y[i]]=w[i]; } vector<int> suml, sumr; suml.push_back(farm[0][0]); sumr.push_back(farm[1][0]); for (int i=1; i<n; i++) { suml.push_back(suml.back()+farm[0][i]); sumr.push_back(sumr.back()+farm[1][i]); } if (n==2) return max(suml.back(), sumr.back()); int ans=sumr.back(); for (int i=0; i<n; i++) { ans=max(ans, suml[i]+sumr.back()-sumr[i]); } return ans; } mini=0; for (int i=0; i<m; i++) { mini=max(mini, (long long) y[i]); } mini++; values.resize(n); for (int i=0; i<m; i++) { values[x[i]].push_back({y[i], w[i]}); } for (int i=0; i<n; i++) { sort(values[i].begin(), values[i].end()); } return dp(0, 0, 0); #undef int }
#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...