萌新求调(WA on #6~8)
查看原帖
萌新求调(WA on #6~8)
610176
Jimmy1112楼主2023/11/17 11:14
#include<bits/stdc++.h>
#define rg register int
#define ll __int128
using namespace std;
const int N=100011;
int n;
ll w[N],h[N];
ll f[N],s[N];
int a[N];
int q[N],tail;
inline ll X(int i)
{
	return h[i];
}
inline ll Y(int i)
{
	return f[i]-s[i]+h[i]*h[i];
}
inline ll K(int i)
{
	return 2*h[i];
}
inline bool xj(ll lx,ll ly,ll rx,ll ry)
{
	return lx*ry<rx*ly;
}
inline bool cmp(int l,int r)
{
	if(X(l)==X(r)) return Y(l)>Y(r);
	return X(l)<X(r);
}
inline void aa(int L,int R)
{
	if(L==R) return ;
	int MID=(L+R)>>1;
	aa(L,MID);
	for(rg i=L;i<=MID;i++) a[i]=i;
	sort(a+L,a+MID+1,cmp);
	tail=1;
	q[1]=a[L];
	for(rg i=L+1;i<=MID;i++)
	{
		while(tail>1&&xj(X(q[tail])-X(q[tail-1]),Y(q[tail])-Y(q[tail-1]),X(a[i])-X(q[tail-1]),Y(a[i])-Y(q[tail-1]))) tail--;
		q[++tail]=a[i];
	}
	for(rg i=MID+1;i<=R;i++)
	{
		int l=1,r=tail,mid;
		while(l<r)
		{
			mid=(l+r+1)>>1;
			if(X(q[mid-1])-X(q[mid])>=0)
			{
				if(X(q[mid-1])-X(q[mid])==0) l=mid;
				else
				if(Y(q[mid-1])-Y(q[mid])<K(i)*(X(q[mid-1])-X(q[mid]))) l=mid;
				else r=mid-1;
			}
			else
			{
				if(Y(q[mid-1])-Y(q[mid])>K(i)*(X(q[mid-1])-X(q[mid]))) l=mid;
				else r=mid-1;
			}
		}
		f[i]=min(f[i],f[q[l]]+s[i-1]-s[q[l]]+(h[i]-h[q[l]])*(h[i]-h[q[l]]));
	}
	aa(MID+1,R);
}
inline ll rd()
{
	ll ss=0,ww=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') ww=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ss=(ss<<1)+(ss<<3)+(ch^48);
		ch=getchar();
	}
	return ss*ww;
}
inline void wt(ll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>=10) wt(x/10);
	putchar(x%10+'0');
}
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("","w",stdout);
	n=rd();
//	scanf("%lld",&n);
	for(rg i=1;i<=n;i++)
	{
//		scanf("%lld",&h[i]);
		h[i]=rd();
	}
	s[0]=0;
	for(rg i=1;i<=n;i++)
	{
//		scanf("%lld",&w[i]);
		w[i]=rd();
		s[i]=s[i-1]+w[i];
	}
	f[1]=0;
	for(rg i=2;i<=n;i++) f[i]=1e30;
	aa(1,n);
//	printf("%lld",f[n]);
	wt(f[n]);
	return 0;
}

2023/11/17 11:14
加载中...