比赛 NOIP2025模拟赛2 评测结果 AAAAAAAAAAAAAAAA
题目名称 桥梁建设 最终得分 100
用户昵称 梦那边的美好TE 运行时间 0.672 s
代码语言 C++ 内存使用 6.66 MiB
提交时间 2025-11-25 09:37:09
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const ll V=1e6;
const ll inf=1e18;
int n;
ll h[N],s[N],f[N];
struct sgt{
	ll k[N],b[N];
	int mx[N<<2];
	#define ls (p<<1)
	#define rs (p<<1|1)
	ll val(int p,int x){
		return k[p]*x+b[p];
	}
	void calc(int i){
		k[i]=-2*h[i];
		b[i]=f[i]+h[i]*h[i]-s[i];
	}
	void insert(int p,int l,int r,int x){
		int mid=(l+r)>>1;
		if(val(mx[p],mid)>val(x,mid))swap(mx[p],x);
		if(l==r)return;
		if(val(mx[p],l)>val(x,l))insert(ls,l,mid,x);
		if(val(mx[p],r)>val(x,r))insert(rs,mid+1,r,x);
	}
	ll ask(int p,int l,int r,int x){
		if(!mx[p])return inf;int mid=(l+r)>>1;
		if(x<=mid)return min(ask(ls,l,mid,x),val(mx[p],x));
		if(x>mid)return min(ask(rs,mid+1,r,x),val(mx[p],x));
	}
	#undef ls
	#undef rs
}tr;
int main(){
	freopen("building.in","r",stdin);
	freopen("building.out","w",stdout);
	scanf("%d",&n);tr.b[0]=inf;
	for(int i=1;i<=n;i++)scanf("%lld",h+i);
	for(int i=1;i<=n;i++){
		scanf("%lld",s+i);
		s[i]+=s[i-1];
	}
	tr.calc(1);tr.insert(1,0,V,1);
	for(int i=2;i<=n;i++){
		f[i]=tr.ask(1,0,V,h[i])+h[i]*h[i]+s[i-1];
		tr.calc(i),tr.insert(1,0,V,i);
	}
	printf("%lld\n",f[n]);
	return 0;
}