제출 #1275216

#제출 시각아이디문제언어결과실행 시간메모리
1275216danglayloi1Building Bridges (CEOI17_building)C++20
100 / 100
40 ms65220 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define fi first #define se second #define inf 0x3f3f3f3f3f3f3f3f using namespace std; using ll = long long; const ll mod=1e9+7; const int nx=1e5+5; struct dak { ll a, b; dak() : a(0), b(0) {} dak(ll a, ll b) : a(a), b(b) {} ll cal(ll x) { return a*x+b; } }; struct lichao { vector<dak> nod; lichao() {} lichao(int sz) : nod(sz*4+5, dak(0, inf)) {} void update(int id, int l, int r, dak f) { if(l==r) { nod[id]=(f.cal(l)<nod[id].cal(l)?f:nod[id]); return; } int mid=(l+r)>>1; if(f.cal(mid)<nod[id].cal(mid)) swap(nod[id], f); if(f.a>nod[id].a) update(id<<1, l, mid, f); if(f.a<nod[id].a) update(id<<1|1, mid+1, r, f); } ll get(int id, int l, int r, int p) { ll cur=nod[id].cal(p); int mid=(l+r)>>1; if(l==r) return cur; if(p<=mid) return min(cur, get(id<<1, l, mid, p)); return min(cur, get(id<<1|1, mid+1, r, p)); } }; int n; ll h[nx], a[nx], dp[nx], mx=0; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i = 1; i <= n; i++) cin>>h[i], mx=max(mx, h[i]); for(int i = 1; i <= n; i++) cin>>a[i], a[i]+=a[i-1]; memset(dp, -0x3f, sizeof(dp)); dp[1]=0; lichao st(mx); for(int i = 1; i <= n; i++) { if(i>1) { dp[i]=st.get(1, 0, mx, h[i])+a[i-1]+h[i]*h[i]; } st.update(1, 0, mx, dak(-2ll*h[i], dp[i]-a[i]+h[i]*h[i])); } cout<<dp[n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...