WA on #3 #10 #16 #18 #19 求助
查看原帖
WA on #3 #10 #16 #18 #19 求助
457518
czy_0021楼主2024/12/8 11:18
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e6+10;
int n,h[N],s[N],f[N];
struct node{
    int k;
    int b;
    int id;
}a[N],v;
int vis(int k,int x){
    return x*a[k].k+a[k].b;
}
int change(int k,int l,int r){
    if(vis(k,l)>v.k*l+v.b&&vis(k,r)>v.k*r+v.b){
        a[k]=v;
        return 0;
    }
    if(vis(k,l)<=v.k*l+v.b&&vis(k,r)<=v.k*r+v.b)return 0;
    int mid=(l+r)/2;
    change(k*2,l,mid);
    change(k*2+1,mid+1,r);
    return 0;
}
int ask(int k,int l,int r,int x){
    if(r<x||l>x)return 0;
    int ans=vis(k,x),p=k;
    int mid=(l+r)/2;
    if(l==r)return p;
    int t=ask(k*2,l,mid,x);
    if(t!=0&&vis(t,x)<vis(p,x))p=t;
    t=ask(k*2+1,mid+1,r,x);
    if(t!=0&&vis(t,x)<vis(p,x))p=t;
    return p;
}
void build(int k,int l,int r){
	a[k].b=1e18;
	if(l==r)return;
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
}
signed main(){
    cin>>n;
    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];
	}
	build(1,1,1000000);
    for(int i=2;i<=n;i++){
    	f[i]=min((h[i]-h[1])*(h[i]-h[1])+s[i-1]-s[1],vis(ask(1,1,1000000,h[i]),h[i])+h[i]*h[i]+s[i-1]);
    	v.k=-2*h[i];v.b=f[i]+h[i]*h[i]-s[i];
    	change(1,1,1000000);
	}
	cout<<f[n];
    return 0;
}
2024/12/8 11:18
加载中...