Submission #1032136

#TimeUsernameProblemLanguageResultExecution timeMemory
1032136Mr_HusanboyCatfish Farm (IOI22_fish)C++17
0 / 100
860 ms2097152 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<vector<ll>> s(n, vector<ll>(n + 1)); for(int i = 0; i < m; i ++) s[x[i]][y[i] + 1] = w[i]; for(int i = 0; i < n; i ++){ for(int j = 1; j <= n; j ++) s[i][j] += s[i][j - 1];//, cout << s[i][j]<< ' '; // cout << endl; } vector dp(n, vector(n + 1, vector(n + 1, 0ll))); for(int j = 0; j <= n; j ++){ for(int k = j; k <= n; k ++){ dp[1][j][k] = s[0][k] - s[0][j]; } for(int k = 0; k < j; k ++){ dp[1][j][k] = s[1][j] - s[1][k]; } // for(int k = 0; k <= n; k ++){ // //cout << dp[1][j][k] << ' '; // cout << s[1][k] << ' '; // }cout << endl; } SegmentTree st; for(int i = 2; i < n; i ++){ for(int j = 0; j <= n; j ++){ ll mx = 0; for(int k = 0; k <= j; k ++){ mx = max(mx, dp[i - 1][k][j]); } for(int k = j; k <= n; k ++){ dp[i][j][k] = mx + s[i - 1][k] - s[i - 1][j]; } st.init(n + 1); for(int k = j; k <= n; k ++) st.upd(k, k, dp[i - 1][k][j]); for(int k = j; k <= n; k ++){ if(k != j){ st.upd(j, k, s[i - 1][k] - s[i - 1][k - 1]); } dp[i][j][k] = max(dp[i][j][k], st.get(j, n).mn); } mx = 0; for(int k = 0; k <= n; k ++){mx = max(mx, dp[i - 1][k][j]);} for(int k = 0; k < j; k ++) dp[i][j][k] = mx + s[i][j] - s[i][k]; // for(int k = 0; k < j; k ++) cout << dp[i][j][k] << ' '; // cout << endl; } } ll ans = 0; for(int i = 0; i <= n; i ++) ans = max(ans, *max_element(all(dp[n - 1][i]))); 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...