不知道怎么回事啊,n2 打完之后想起来练一练斜率优化,然后就码李超线段树,然后一直样例都没过,我看题解区没有一个用李超树的
抓个大佬帮忙看看荏弱代码
#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
*/