Submission #964220

#TimeUsernameProblemLanguageResultExecution timeMemory
964220pccBuilding Bridges (CEOI17_building)C++17
100 / 100
56 ms73348 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pll pair<ll,ll>
#define pii pair<int,int>
#define fs first
#define sc second
#define tlll tuple<ll,ll,ll>

const ll inf = 1e18;
const ll mxn = 1e6+10;

struct line{
	ll m,b;
	line(){
		m = 0;
		b = inf;
	}
	line(ll mm,ll bb):m(mm),b(bb){}
	ll operator()(ll x){
		return m*x+b;
	}
};



struct SEG{
	line seg[mxn*4];
	SEG(){}
	void addline(int now,int l,int r,line k){
		if(l == r){
			if(seg[now](l)>k(l))swap(seg[now],k);
			return;
		}
		int mid = (l+r)>>1;
		if(seg[now](mid)>k(mid))swap(seg[now],k);
		if(seg[now].m<k.m)addline(now*2+1,l,mid,k);
		else addline(now*2+2,mid+1,r,k);
		return;
	}
	ll getval(int now,int l,int r,int p){
		if(l == r)return seg[now](p);
		int mid = (l+r)>>1;
		if(mid>=p)return min(seg[now](p),getval(now*2+1,l,mid,p));
		else return min(seg[now](p),getval(now*2+2,mid+1,r,p));
	}
};

SEG seg;
ll H[mxn],pref[mxn];
ll N;
ll dp[mxn];

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>N;
	for(int i = 1;i<=N;i++)cin>>H[i];
	for(int i = 1;i<=N;i++)cin>>pref[i],pref[i] += pref[i-1];
	seg.addline(0,0,mxn-1,line(-H[1]*2,dp[1]+H[1]*H[1]-pref[1]));
	for(int i = 2;i<=N;i++){
		dp[i] = seg.getval(0,0,mxn-1,H[i])+pref[i-1]+H[i]*H[i];
		seg.addline(0,0,mxn-1,line(-H[i]*2,dp[i]+H[i]*H[i]-pref[i]));
	}
	cout<<dp[N];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...