这是我的代码:
#include<bits/stdc++.h>
#define LL ls[p]
#define RR rs[p]
#define int long long
using namespace std;
const int N=1e6+7;
const int MAXN=1e13+7;
struct LINE
{
int k,b;
LINE(){}
LINE(int kk,int bb):k(kk),b(bb){}
}line[N];
struct Li_Seg_Tree
{
int tree[N],ls[N],rs[N],cnt,root;
inline int calc(int id,int x){return x*line[id].k+line[id].b;}
inline bool cmp(int A,int B,int x){return calc(A,x)<calc(B,x);}
inline void insert(int &p,int l,int r,int id)
{
if(!p) p=++cnt;
if(l==r)
{
tree[p]=id;
return;
}
if(!tree[p])
{
tree[p]=id;
return;
}
if(cmp(id,tree[p],l)&&cmp(id,tree[p],r))
{
tree[p]=id;
return;
}
int mid=l+r>>1;
if(cmp(id,tree[p],mid)) swap(id,tree[p]);
if(cmp(id,tree[p],l)) insert(LL,l,mid,id);
if(cmp(id,tree[p],r)) insert(RR,mid+1,r,id);
}
inline int query(int p,int l,int r,int x)
{
int ans=calc(tree[p],x);
if(!p||l==r) return ans;
int mid=l+r>>1;
if(mid>=x) ans=min(ans,query(LL,l,mid,x));
else ans=min(ans,query(RR,mid+1,r,x));
return ans;
}
}seg;
int n;
int f[N];
int h[N],w[N],sum[N];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&h[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&w[i]);
sum[i]=sum[i-1]+w[i];
}
line[0]=LINE(0,1e18);
f[1]=0;
line[1]=LINE(-2*h[1],f[1]-sum[1]+h[1]*h[1]);
seg.insert(seg.root,1,MAXN,1);
for(int i=2;i<=n;i++)
{
f[i]=seg.query(seg.root,1,MAXN,h[i])+sum[i-1]+h[i]*h[i];
line[i]=LINE(-2*h[i],f[i]-sum[i]+h[i]*h[i]);
seg.insert(seg.root,1,MAXN,i);
}
printf("%lld\n",f[n]);
}
其中,MAXN 是值域,为何开大后会 WA?