Submission #625733

#TimeUsernameProblemLanguageResultExecution timeMemory
625733d4xnCatfish Farm (IOI22_fish)C++17
23 / 100
1090 ms59880 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; //#define int long long #define ll long long #define vi vector<int> #define ii pair<int, int> #define vii vector<ii> #define tuple3 tuple<int, int, int> const int N = 1e5+5, inf = INT_MAX; int n, m; map<int, int> w[N]; vi c[N]; map<tuple<int, int, int>, ll> dp; // dp[i][j][k] = maximos peces que puedo conseguir // con las k primeras columnas donde // en la columna k+1 he subido i-1 // en la columna k+2 he subido j-1 ll mx(int curr, int h1, int h2) { if (curr == -1) return 0; tuple3 t = make_tuple(curr, h1, h2); auto it = dp.find(t); if (it != dp.end()) return it->second; dp[t] = mx(curr-1, 0, h1); it = dp.find(t); if (curr+1 < n) { for (int h : c[curr+1]) { h++; ll cnt = 0; // ver si pillo los de la derecha if (curr+1 < n) { for (int i = 0; i < h; i++) { auto it2 = w[curr+1].find(i); if (it2 != w[curr+1].end() && h2-1 < i && h1-1 < i) cnt += it2->second; } } // ver si pillo los de la izquierda if (curr-1 >= 0) { for (int i = 0; i < h; i++) { auto it2 = w[curr-1].find(i); if (it2 != w[curr-1].end()) cnt += it2->second; } } // ver si he eliminado alguno de los que he pillado for (int i = 0; i < min(h, h1); i++) { auto it2 = w[curr].find(i); if (it2 != w[curr].end()) cnt -= it2->second; } it->second = max(it->second, cnt + mx(curr-1, h, h1)); } } if (curr-1 >= 0) { for (int h : c[curr-1]) { h++; ll cnt = 0; // ver si pillo los de la derecha if (curr+1 < n) { for (int i = 0; i < h; i++) { auto it2 = w[curr+1].find(i); if (it2 != w[curr+1].end() && h2-1 < i && h1-1 < i) cnt += it2->second; } } // ver si pillo los de la izquierda if (curr-1 >= 0) { for (int i = 0; i < h; i++) { auto it2 = w[curr-1].find(i); if (it2 != w[curr-1].end()) cnt += it2->second; } } // ver si he eliminado alguno de los que he pillado for (int i = 0; i < min(h, h1); i++) { auto it2 = w[curr].find(i); if (it2 != w[curr].end()) cnt -= it2->second; } it->second = max(it->second, cnt + mx(curr-1, h, h1)); } } 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++) { w[X[i]][Y[i]] = W[i]; c[X[i]].push_back(Y[i]); } return mx(n-1, 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...