Submission #1032201

#TimeUsernameProblemLanguageResultExecution timeMemory
1032201Mr_HusanboyCatfish Farm (IOI22_fish)C++17
14 / 100
1099 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; } int h = min(8, n); vector dp(h + 1, vector(h + 1, 0ll)); for(int i = 0; i <= h; i ++){ for(int j = 0; j <= i; j ++){ dp[i][j] = s[1][i] - s[1][j]; } for(int j = i + 1; j <= h; j ++){ dp[i][j] = s[0][j] - s[0][i]; } } for(int c = 2; c < n; c ++){ vector tdp(h + 1, vector(h + 1, 0ll)); for(int i = 0; i <= h; i ++){ ll mx = 0; for(int j = 0; j <= h; j ++){ mx = max(mx, dp[j][i]); } for(int j = 0; j <= i; j ++){ tdp[i][j] = s[c][i] - s[c][j] + mx; } mx = 0; for(int j = 0; j <= i; j ++) mx = max(mx, dp[j][i]); for(int j = i + 1; j <= h; j ++){ tdp[i][j] = mx + s[c - 1][j] - s[c - 1][i]; for(int k = i + 1; k < j; k ++){ tdp[i][j] = max(tdp[i][j], dp[k][i] + s[c - 1][j] - s[c - 1][k]); } for(int k = j; k <= h; k ++){ tdp[i][j] = max(tdp[i][j], dp[k][i]); } } } swap(tdp, dp); } ll ans = 0; for(int i = 0; i <= h; i ++){ ans = max(ans, *max_element(all(dp[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...