#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
long long a[maxn],p[maxn],x[maxn],c[maxn],s[maxn];
int n;
long long q[maxn],dp[maxn],y[maxn];
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&p[i],&x[i]);
c[i]=c[i-1]+p[i];
s[i]=s[i-1]+1ll*p[i]*a[i];
}
int head=1,tail=1;
q[1]=0;
dp[0]=x[0];
y[0]=dp[0]+s[0];
for(int i=1;i<=n;i++)
{
while(head<tail&&y[q[head+1]]-y[q[head]]<1ll*a[i]*(c[q[head+1]]-c[q[head]]))
head++;
dp[i]=dp[q[head]]+1ll*a[i]*(c[i]-c[q[head]])-(s[i]-s[q[head]])+x[i];//cout<<dp[i]<<endl;
y[i]=dp[i]+s[i];
while(head<tail&&1ll*(y[q[tail]]-y[q[tail-1]])*(c[i]-c[q[tail]])>=1ll*(y[i]-y[q[tail]])*(c[q[tail]]-c[q[tail-1]]))
tail--;
q[++tail]=i;
}
cout<<dp[n];
}
c[i]前缀和 s[i]权值前缀和
然后dp,搞一个斜率优化
特别注意:队列的点可以为0!!!!!!!!!!!!所以要随便搞一搞;
至于第二个式子的不等号方向 我也不会推,但是我会无脑暴力对拍
就是这样
GG
——By WXH