Submission #1174894

#TimeUsernameProblemLanguageResultExecution timeMemory
1174894ZeroCoolBuilding Bridges (CEOI17_building)C++20
100 / 100
62 ms17308 KiB
#include <bits/stdc++.h> #define int long long #define ll long long #define ld long double #define ar array #define all(v) v.begin(), v.end() using namespace std; const int N = 5e5 + 20; const int LOG = 20; const int INF = 1e12; const int MOD = 1e9 + 7; void chmin(int &x,int y){x = min(x, y);}; void chmax(int &x,int y){x = max(x, y);}; void mm(int &x){x = (x % MOD + MOD) % MOD;}; struct LCT{ int n; LCT(int _n){ n = _n; } struct Line{ int m, b; int operator()(int x){ return m * x + b; } } kek{0ll, -INF}; vector<Line> s = {kek}; vector<int> L = {0}; vector<int> R = {0}; int get(){ s.push_back(kek); L.push_back(0); R.push_back(0); return s.size() - 1; } void upd(int k,int tl,int tr, Line l){ // cout<<k<<' '; if(tl == tr){ if(l(tl) > s[k](tl))s[k] = l; return; } int tm = (tl + tr) / 2; if(s[k].m > l.m)swap(s[k], l); if(s[k](tm) < l(tm)){ swap(s[k], l); if(!L[k])L[k] = get(); upd(L[k], tl, tm, l); }else{ if(!R[k])R[k] = get(); upd(R[k], tm + 1, tr, l); } } int qry(int k,int tl,int tr,int x){ if(tl == tr)return s[k](x); int tm = (tl + tr) / 2; if(x <= tm)return max(s[k](x), (L[k] ? qry(L[k], tl, tm, x) : -INF)); else return max(s[k](x), (R[k] ? qry(R[k], tm + 1, tr, x) : -INF)); } void upd(Line l){ upd(0, 0, n - 1, l); } int qry(int x){ return qry(0, 0, n - 1, x); } }; signed main(){ios_base::sync_with_stdio(false);cin.tie(0); int n; cin>>n; int A[n], B[n]; for(int i = 0;i < n;i++)cin>>A[i]; int sum = 0; //cout<<kek(69)<<'\n'; for(int i = 0;i < n;i++)cin>>B[i], sum += B[i]; int dp[n]; dp[0] = -B[0]; LCT lct(1e9); for(int i = 1;i < n;i++){ lct.upd({2 * A[i - 1], -dp[i - 1] - A[i - 1] * A[i - 1]}); //cout<<'\n'; dp[i] = -lct.qry(A[i]) - B[i] + A[i] * A[i]; } cout<<dp[n -1] + sum; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...