Submission #1181290

#TimeUsernameProblemLanguageResultExecution timeMemory
1181290PagodePaivaCatfish Farm (IOI22_fish)C++20
52 / 100
460 ms298852 KiB
#include "fish.h" #include<bits/stdc++.h> #include <vector> #pragma GCC optimize("O3") #define ll long long using namespace std; const int N = 3010; const int LOGN = 12; struct RMQ{ ll pref[N], suf[N]; int n; void build(vector <ll> &v){ n = v.size(); pref[0] = -1e18; for(int i = 1;i <= n;i++){ pref[i] = max(pref[i-1], v[i-1]); } suf[n+1] = -1e18; for(int i = n;i > 0;i--){ suf[i] = max(suf[i+1], v[i-1]); } return; } ll query(int l, int r){ l++; r++; if(l > r) return -1e18; if(l == 0) return pref[r]; return suf[l]; } } rmq[2]; ll dp[N][N][4]; vector <pair <int, ll>> x[N]; int n, m; ll pref[N][2]; long long max_weights(int NN, int MM, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { n = NN; m = MM; for(int i = 0;i < m;i++){ x[X[i]+1].push_back({Y[i]+1, W[i]}); } for(int i = 0;i < N;i++){ sort(x[i].begin(), x[i].end()); } for(int i = 1;i <= n;i++){ //cout << i << '\n'; vector <ll> ant; for(int j = 1, l = 0;j <= n;j++){ pref[j][0] = pref[j-1][0]; if(l != x[i].size()){ if(x[i][l].first == j){ pref[j][0] += x[i][l].second; l++; } } } for(int j = 1, l = 0;j <= n;j++){ pref[j][1] = pref[j-1][1]; if(l != x[i+1].size()){ if(x[i+1][l].first == j){ pref[j][1] += x[i+1][l].second; l++; } } } for(int y = 0;y <= n;y++){ ant.push_back(dp[i-1][y][1]-pref[y][0]); //if(i == 3) //cout << ant.back() << ' '; } //if(i == 3) //cout << '\n'; //// //cout << '\n'; rmq[0].build(ant); ant.clear(); for(int y = 0;y <= n;y++){ ant.push_back(max({dp[i-1][y][0]+pref[y][1]})); // //cout << pref[y][1] << ' '; } // //cout << '\n'; rmq[1].build(ant); // //cout << rmq[1].query(1, n) << ' ' << rmq[1].query(2, n) << '\n'; // //cout << pref[0][1] << ' ' << pref[1][1] << '\n'; for(int y = 0;y <= n;y++){ dp[i][y][0] = max({rmq[0].query(0, y)+pref[y][0], rmq[1].query(y+1, n)-pref[y][1], dp[i-1][y][2] + pref[y][0], dp[i-1][y][3] + pref[y][0]}); //cout << dp[i][y][0] << ' '; } //cout << '\n'; ant.clear(); for(int y = 0;y <= n;y++){ ant.push_back(dp[i-1][y][1] -pref[y][0]); ////// //cout << ant.back() << ' '; } // //// //cout << '\n'; rmq[0].build(ant); for(int y = 0;y <= n;y++){ dp[i][y][1] = max({rmq[0].query(0, y)+pref[y][0], dp[i-1][y][2], dp[i-1][y][3]}); //cout << dp[i][y][1] << ' '; } //cout << '\n'; ant.clear(); for(int y = 0;y <= n;y++){ ant.push_back(dp[i-1][y][0]); } rmq[0].build(ant); for(int y = 0;y <= n;y++){ dp[i][y][2] = rmq[0].query(0, y); //cout << dp[i][y][2] << ' '; } //cout << '\n'; ant.clear(); for(int y = 0;y <= n;y++){ ant.push_back(dp[i-1][y][0]+pref[y][1]); } rmq[0].build(ant); for(int y = 0;y <= n;y++){ dp[i][y][3] = rmq[0].query(y, n)- pref[y][1]; //cout << dp[i][y][3] << ' '; } //cout << '\n'; } return dp[n][0][0]; }
#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...