Submission #1032821

#TimeUsernameProblemLanguageResultExecution timeMemory
1032821Mr_HusanboyCatfish Farm (IOI22_fish)C++17
0 / 100
1084 ms315704 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; #define ff first #define ss second #define all(a) (a).begin(), (a).end() #define ll long long template<typename T> int len(T &a){ return a.size(); } mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); struct SegmentTree{ //To change struct Node{ //defaults ll mn = 0, add = 0; bool marked = false; void apply(ll val){ mn += val; add += val; marked = true; } }; void push(int x){ if(t[x].marked){ t[x << 1].apply(t[x].add); t[x << 1 | 1].apply(t[x].add); t[x].add = 0; t[x].marked = false; } } Node merge(Node a, Node b){ Node res; if(a.mn > b.mn){ res.mn = a.mn; }else{ res.mn = b.mn; } return res; } Node neutral; vector<Node> t; int n; //construction void init(int _n){ n = _n; t.assign(4 * n, neutral); } void build(vector<int> &a, int x, int lx, int rx){ if(lx == rx){ t[x].mn = a[lx]; return; } int mx = (lx + rx) >> 1; build(a, x << 1, lx, mx); build(a, x << 1 | 1, mx + 1, rx); t[x] = merge(t[x << 1], t[x << 1 | 1]); } void upd(int x, int lx, int rx, int l, int r, int val){ if(rx < l || r < lx) return; if(l <= lx && rx <= r){ t[x].apply(val); return; } push(x); int mx = (lx + rx) >> 1; upd(x << 1, lx, mx, l, r, val); upd(x << 1 | 1, mx + 1, rx, l, r, val); t[x] = merge(t[x << 1], t[x << 1 | 1]); } Node get(int x, int lx, int rx, int l, int r){ if(rx < l || r < lx){ return neutral; } if(l <= lx && rx <= r){ return t[x]; } push(x); int mx = (lx + rx) >> 1; return merge(get(x << 1, lx, mx, l, r), get(x << 1 | 1, mx + 1, rx, l, r)); } // lessen void build(vector<int> &a){ int sz = len(a); init(sz); build(a, 1, 0, n - 1); } void upd(int l, int r, int val){ upd(1, 0, n - 1, l, r, val); } Node get(int l, int r){ return get(1, 0, n - 1, l, r); } }; long long max_weights(int n, int m, std::vector<int> x, std::vector<int> y, std::vector<int> w) { vector<map<int, ll>> s(n); vector<map<int, ll>> pref(n); for(int i = 0; i < m; i ++) s[x[i]][y[i] + 1] = w[i]; pref = s; for(int i = 0; i < n; i ++){ s[i][0] = 0; if(i) for(auto [a, b] : s[i - 1]) s[i][a] = max(s[i][a], 0ll); if(i + 1 < n) for(auto [a, b] : s[i + 1]) s[i][a] = max(s[i][a], 0ll); ll cur = 0; for(auto &[_, ss] : pref[i]){ cur += ss; ss = cur; } } map<tuple<int,int,int>, ll> memo; auto calc = [&](auto &calc, int st, int i, int j)->ll{ if(st == 1){ if(i < j){ return pref[st - 1][j] - pref[st - 1][i]; } return pref[st][i] - pref[st][j]; } if(memo.count({st, i, j})) return memo[{st, i, j}]; if(i >= j){ ll mx = 0; for(auto [k, val] : s[st - 2]){ mx = max(mx, calc(calc, st - 1, k, i)); } return memo[{st, i, j}] = mx + pref[st][i] - pref[st][j]; } ll res = 0; ll sum = pref[st - 1][j] - pref[st - 1][i]; for(auto [k, val] : s[st - 2]){ if(k <= i){ res = max(res, calc(calc, st - 1, k, i) + sum); }else if(k < j){ res = max(res, calc(calc, st - 1, k, j) + pref[st - 1][j] - pref[st - 1][k]); }else res = max(res, calc(calc, st - 1, k, j)); } return memo[{st, i, j}] = res; }; ll ans = 0; for(auto [i, _] : s[n - 2]){ for(auto [j, __] : s[n - 1]){ ans = max(ans, calc(calc, n - 1, i, j)); } } 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...