Submission #626653

#TimeUsernameProblemLanguageResultExecution timeMemory
626653d4xnCatfish Farm (IOI22_fish)C++17
37 / 100
1094 ms157548 KiB
#pragma GCC optimize ("Ofast") #include "fish.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define vi vector<int> #define ii pair<int, int> #define vii vector<ii> #define tuple2 tuple<int, int> #define tuple3 tuple<int, int, int> const int N = 1e5; int n, m; vi c[N]; map<int, int> w[N]; map<int, ll> pre[N]; map<int, ll> dp[3][N]; ll preS(int col, int x) { auto it = pre[col].upper_bound(x); if (it == pre[col].begin()) return 0; return (--it)->second; } ll mx(int curr, int h1, int state) { if (curr == -1) return 0; auto it = dp[state][curr].find(h1); if (it != dp[state][curr].end()) return it->second; if (state != 2) dp[state][curr][h1] = mx(curr-1, h1, 2); else dp[state][curr][h1] = mx(curr-1, 0, 1); it = dp[state][curr].find(h1); if (!state) { if (curr+1 < n) { for (int h : c[curr+1]) { h++; if (h >= h1) break; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si he eliminado alguno de los que he pillado cnt -= preS(curr, h-1); it->second = max(it->second, cnt + mx(curr-1, h, 0)); } } if (curr-1 >= 0) { for (int h : c[curr-1]) { h++; if (h >= h1) break; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si he eliminado alguno de los que he pillado cnt -= preS(curr, h-1); it->second = max(it->second, cnt + mx(curr-1, h, 0)); } } } else if (state == 1) { if (curr+1 < n) { for (int h : c[curr+1]) { h++; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si pillo los de la derecha if (h > h1 && curr+1 < n) { cnt += preS(curr+1, h-1) - preS(curr+1, h1-1); } // ver si he eliminado alguno de los que he pillado cnt -= preS(curr, min(h, h1)-1); if (h <= h1) it->second = max(it->second, cnt + mx(curr-1, h, 0)); else it->second = max(it->second, cnt + mx(curr-1, h, 1)); } } if (curr-1 >= 0) { for (int h : c[curr-1]) { h++; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si pillo los de la derecha if (h > h1 && curr+1 < n) { cnt += preS(curr+1, h-1) - preS(curr+1, h1-1); } // ver si he eliminado alguno de los que he pillado cnt -= preS(curr, min(h, h1)-1); if (h <= h1) it->second = max(it->second, cnt + mx(curr-1, h, 0)); else it->second = max(it->second, cnt + mx(curr-1, h, 1)); } } } else { if (curr+1 < n) { for (int h : c[curr+1]) { h++; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si pillo los de la derecha if (h > h1 && curr+1 < n) { cnt += preS(curr+1, h-1) - preS(curr+1, h1-1); } it->second = max(it->second, cnt + mx(curr-1, h, 1)); } } if (curr-1 >= 0) { for (int h : c[curr-1]) { h++; ll cnt = 0; // ver si pillo los de la izquierda if (curr-1 >= 0) { cnt += preS(curr-1, h-1); } // ver si pillo los de la derecha if (h > h1 && curr+1 < n) { cnt += preS(curr+1, h-1) - preS(curr+1, h1-1); } it->second = max(it->second, cnt + mx(curr-1, h, 1)); } } } return it->second; } long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { n = N; m = M; for (int i = 0; i < m; i++) { c[X[i]].push_back(Y[i]); w[X[i]][Y[i]] = W[i]; } for (int i = 0; i < n; i++) { sort(c[i].begin(), c[i].end()); ll sum = 0; for (int &h : c[i]) { sum += w[i][h]; pre[i][h] = sum; } pre[i][-1] = 0; } return mx(n-1, 0, 1); }
#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...