/*
一道题做了一个上午,无语了。。。
我自己做的是设dp[i]代表从后往前建立仓库,建到第i个时的最小花费,然后枚举它要搬到的地方
转移方程为dp[i]=min(dp[j-1]+x[j]*(sp[j-1]-sp[i-1])-spx[j-1]+spx[i-1]+c[j])
然后开始斜率优化,WA了一个上午,小数据对拍怎么都过,大数据偶尔出错但是调不了啊!
无奈看别人的代码,发现比我写得简洁得多,从前向后转移的,是把i作为这一段货物的储存点,然后枚举开端,感觉和我的差不多,就是不知道为什么错了。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define N 1000010
#define lon long long
using namespace std;
lon p[N],x[N],sp[N],spx[N],c[N],dp[N],q[N],n;
lon read(){
lon num=0,flag=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)flag=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
return num*flag;
}
double lv(int j,int k){
return (double)(dp[k]+spx[k]-dp[j]-spx[j])/(sp[k]-sp[j]);
}
int main(){
n=read();
for(int i=1;i<=n;i++){
x[i]=read();p[i]=read();c[i]=read();
sp[i]=sp[i-1]+p[i];spx[i]=spx[i-1]+p[i]*x[i];
}
int h=0,t=0;
for(int i=1;i<=n;i++){
while(h<t&&lv(q[h],q[h+1])<x[i]) h++;
dp[i]=dp[q[h]]+(sp[i]-sp[q[h]])*x[i]-spx[i]+spx[q[h]]+c[i];
while(h<t&&lv(q[t],i)<lv(q[t-1],q[t])) t--;
q[++t]=i;
}
cout<<dp[n];
return 0;
}