WA#19求助
查看原帖
WA#19求助
416755
luanyanjia楼主2023/12/19 21:11
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
struct node{
	int h,w,id,_w;
}s[114514],f[114514];
int n,dp[114514];
bool cmp(node a,node b){
	return a.h<b.h;
}
int getx(int a,int b){
	return s[b].h-s[a].h;
}
int gety(int a,int b){
	return dp[s[b].id]+s[b].h*s[b].h-s[b].w-dp[s[a].id]-s[a].h*s[a].h+s[a].w;
}
int q[114514];
void cdq(int l,int r){
	if(l>=r)return ;
	int mid=(l+r)>>1;
	int stan=mid;
	int i=l-1,j=mid;
	for(int t=l;t<=r;t++){
		if(s[t].id<=stan){
			f[++i]=s[t];
		}
		else{
			f[++j]=s[t];
		}
	}
	for(int t=l;t<=r;t++){
		s[t]=f[t];	
	}
	cdq(l,mid);
	int head=1,tail=0;
	q[++tail]=l;
	for(int t=l+1;t<=mid;t++){
		while(tail>=head+1&&gety(q[tail-1],q[tail])*getx(q[tail],t)>=
		gety(q[tail],t)*getx(q[tail-1],q[tail])){
			tail--;
		}
		q[++tail]=t;
	}
	for(int t=mid+1;t<=r;t++){
		int k=2*s[t].h;
		while(tail>=head+1&&gety(q[head],q[head+1])<=
		getx(q[head],q[head+1])*k){
			head++;
		}
		int j=q[head];
		dp[s[t].id]=min(dp[s[t].id],dp[s[j].id]+(s[j].h-s[t].h)*(s[j].h-s[t].h)
		+s[t]._w-s[j].w);
	}
	cdq(mid+1,r);
	i=l,j=mid+1;
	int idx=l-1;
	while(i<=mid&&j<=r){
		if(s[i].h<=s[j].h){
			f[++idx]=s[i++];
		}
		else{
			f[++idx]=s[j++];
		}
	}
	while(i<=mid){
		f[++idx]=s[i++];
	}
	while(j<=r){
		f[++idx]=s[j++];
	}
	for(int t=l;t<=r;t++){
		s[t]=f[t];
	}
	return;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&s[i].h);
		s[i].id=i;
		dp[i]=1e18; 
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&s[i].w);
		s[i].w+=s[i-1].w;
		s[i]._w=s[i-1].w;
	}
	sort(s+1,s+n+1,cmp);
	dp[1]=0;
	cdq(1,n);
//	if(dp[n]==2)
//	{
//		dp[n]=1;
//	}
	printf("%lld",dp[n]);
	return 0;
}
2023/12/19 21:11
加载中...