RT,wa 5分
AC at:#6
#include<iostream>
using namespace std;
typedef long long ll;
typedef long double de;
ll n,r,L,R,MID,f[300005];
de m,t[300005],cc[300005],s[300005],ss[300005],k[300005],b[300005];
struct node{
ll id;
}c[300005];
void push(ll x){
c[++r].id=x;
}
void pop(){
r--;
}
ll size(){
return r;
}
ll empty(){
return (!r);
}
pair<de,ll> inters(ll x,ll y){
if(k[c[x].id]==k[c[y].id]){
return {0,0};
}
return {(b[c[x].id]-b[c[y].id])/(k[c[y].id]-k[c[x].id]),1};
}
ll top(){
return r;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>t[i]>>cc[i];
s[i]=s[i-1]+cc[i];
ss[i]=ss[i-1]+t[i];
}
for(ll i=1;i<=n;i++){
L=1,R=r-1;
while(L<R){
MID=(L+R+1)>>1;
if(inters(MID,MID+1).first<=ss[i]){
L=MID;
}
else{
R=MID-1;
}
}
f[i]=(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n];
// cout<<i<<" "<<f[i]<<" "<<L<<" "<<r<<endl;
if((!(L<r&&inters(L,L+1).first<=ss[i]))&&r>=1){
// cout<<i<<" "<<f[i]<<" "<<L<<" BLOCKING "<<r<<endl;
f[i]=min(f[i],(ll)k[c[r].id]*(ll)ss[i]+(ll)b[c[r].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
}
else if(L<r&&inters(L,L+1).first<=ss[i]){
// cout<<i<<" "<<f[i]<<" "<<L<<" BLOCKed "<<r<<" "<<c[L+1].id<<endl;
f[i]=min(f[i],(ll)k[c[L+1].id]*(ll)ss[i]+(ll)b[c[L+1].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
f[i]=min(f[i],(ll)k[c[L].id]*(ll)ss[i]+(ll)b[c[L].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
}
// cout<<i<<" "<<f[i]<<" "<<L<<" "<<r<<endl;
k[i]=-s[i];
b[i]=-m*s[i]+(de)f[i]-ss[i]*s[n]+ss[i]*s[i];
// cout<<"y="<<k[i]<<"x+"<<b[i]<<endl;
c[300002].id=i;
while(size()>=2){
ll cur=top();
pop();
ll cur2=top();
if(((inters(cur,cur2).second&&inters(cur,300002ll).second)&&(inters(cur,cur2)<inters(cur,300002ll)))||((!inters(cur,cur2).second)||(!inters(cur,300002ll).second))){
push(c[cur].id);
break;
}
}
push(i);
}
cout<<(ll)f[n];
return 0;
}