真不羁绊知道哪里有问题了,眼睛要瞎了,rt
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,s;
int sumt[500005],sumf[500005];
int f[500005],q[500005],head = 0,tail = 0;
int binary_search(int k)
{
int l = head,r = tail,ans = tail;
while (l <= r)
{
int mid = (l+r)>>1;
if (f[q[mid+1]]-f[q[mid]] > k*(sumf[mid+1]-sumf[mid]))
ans = mid,r = mid-1;
else l = mid+1;
}
return q[ans];
}
signed main()
{
cin >> n >> s;
for (int i = 1,t,v; i <= n; i++)
{
cin >> t >> v;
sumt[i] = sumt[i-1]+t;
sumf[i] = sumf[i-1]+v;
}
for (int i = 1; i <= n; i++)
{
int pos = binary_search(sumt[i]+s);
f[i] = f[pos]+sumt[i]*(sumf[i]-sumf[pos])+s*(sumf[n]-sumf[pos]);
while (head < tail && (f[q[tail]]-f[q[tail-1]])*(sumf[i]-sumf[q[tail]]) >= (f[i]-f[q[tail]])*(sumf[q[tail]]-sumf[q[tail-1]]))
tail--;
q[++tail] = i;
}
cout << f[n];
return 0;
}