1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <bits/stdc++.h> using namespace std; #define rep(i,from,to) for(register int i=(int)(from);i<=(int)(to);++i) #define rev(i,from,to) for(register int i=(int)(from);i>=(int)(to);--i) #define For(i,to) for(register int i=0;i<(int)(to);++i) typedef long long ll; inline ll read(){ ll x=0; ll sign=1; char c=getchar(); while(c>'9' c<'0') {if (c=='-') sign=-1;c=getchar();} while(c>='0' && c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();} return x*sign; } #define N 312345 ll n, st[N], sc[N], q[N], l, r, s, f[N];
ll xx(ll j) {return sc[j];} ll yy(ll j) {return f[j]-s*sc[j];} ll dx(ll j1, ll j2) {return xx(j1)-xx(j2);} ll dy(ll j1, ll j2) {return yy(j1)-yy(j2);} double slope(ll j1, ll j2) { if (dx(j1, j2) == 0) return dy(j1, j2) > 0 ? 1.0/0.0 : -1.0/0.0; else return (double)dy(j1, j2) / dx(j1, j2); }
ll binary_search(ll k) { if (l==r) return q[l]; ll L = l; ll R = r; while (L < R) { ll M = (L + R) >> 1; if (slope(q[M+1], q[M]) <= (double)k) L = M + 1; else R = M; } return q[L]; }
int main() { n=read(),s=read(); rep(i,1,n){ st[i]=st[i-1]+read(); sc[i]=sc[i-1]+read(); } l=r=1; rep(i,1,n){ ll j = binary_search(st[i]); f[i] = f[j]+st[i]*(sc[i]-sc[j])+s*(sc[n]-sc[j]); while(l<r && slope(q[r-1], q[r])>=slope(q[r-1], i)) --r; q[++r] = i; } cout<<f[n]<<"\n";
return 0; }
|