关于李超线段树在斜率优化中的适用范围
查看原帖
关于李超线段树在斜率优化中的适用范围
404249
yyhde3301楼主2021/8/10 00:37

不知道怎么回事啊,n2n^2 打完之后想起来练一练斜率优化,然后就码李超线段树,然后一直样例都没过,我看题解区没有一个用李超树的

抓个大佬帮忙看看荏弱代码

#include<bits/stdc++.h>
typedef long long ll;
using std::sort;using std::lower_bound;
//using namespace std;
template<typename T>T max(T a,T b){return a<b?b:a;}
template<typename T>T min(T a,T b){return a<b?a:b;}
template<typename T>void swap(T &a,T &b){T c=a;a=b;b=c;}

const int maxn=5*1e3;
int n,s,t[maxn+7],p[maxn+7];
int f[maxn+7],pret[maxn+7],prep[maxn+7];

int k[maxn+7],b[maxn+7],lnc;
int get(int x,int a){return k[a]*x+b[a];}
int lcv[maxn+7];
void insert(int a,int x,int xl,int xr){
	if(xl==xr){if(get(xl,a)<get(xl,lcv[x]))lcv[x]=a;return;}
	int xm=xl+xr>>1;
	if(get(xm,a)<get(xm,lcv[x]))swap(a,lcv[x]);
	if(get(xl,a)>get(xl,lcv[x]))insert(a,x<<1|1,xm+1,xr);
	else insert(a,x<<1,xl,xm);
}
int query(int p,int x,int xl,int xr){
	if(xl==xr)return get(p,lcv[x]);
	int xm=xl+xr>>1;
	return min(get(p,lcv[x]),p<=xm?query(p,x<<1,xl,xm):query(p,x<<1|1,xm+1,xr));
}

int main(){
	scanf("%d%d",&n,&s);
	for(int i=1;i<=n;++i)
		scanf("%d%d",&t[i],&p[i]),
		pret[i]=pret[i-1]+t[i],
		prep[i]=prep[i-1]+p[i];
	memset(b,0x3f,sizeof(b));
	
	f[1]=pret[1]*prep[1]+s*prep[n];
	++lnc;k[lnc]=-prep[1];b[lnc]=f[1]-s*prep[1];
	insert(lnc,1,1,n);
	for(int i=2;i<=n;++i){
		f[i]=pret[i]*prep[i]+s*prep[n]+query(pret[i],1,1,n);
		++lnc;k[lnc]=-prep[i];b[lnc]=f[i]-s*prep[i];
		insert(lnc,1,1,n);
	}
//	for(int i=1;i<=n;++i)
//		printf("%d ",f[i]);
	printf("%d",f[n]);
	return 0;
}
/*
5
1
1 3
3 2
4 3
2 3
1 4
*/
2021/8/10 00:37
加载中...