疑惑
查看原帖
疑惑
1045879
cheng2010楼主2024/8/20 07:45

这是我的代码:

#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?

2024/8/20 07:45
加载中...