#include using namespace std; typedef long long LL; const int N = 300010; LL t[N], c[N], f[N]; int q[N]; int main() { int n, s; cin >> n >> s; for (int i = 1; i <= n; i++) cin >> t[i] >> c[i], t[i] += t[i - 1], c[i] += c[i - 1]; int hh = 0, tt = 0; // 哨兵 for (int i = 1; i <= n; i++) { /* Q:为什么是 hh < tt ? A:队列中最少有两个元素,才能考虑计算斜率,才能开始出队头 队列中一个元素,hh=0,tt=0 队列中两个元素,hh=0,tt=1 这样的情况下,保证了最少有一条边,才有斜率概念 (1) k=st[i]+S 所有数据是正数,所以k是单调递增的 (2) k从下向上移动,找到与点集的第一个交点,必然在下凸壳上 (3) 在相交时,其实是与三个点组成的两条直线进行相交,设 a,b,c,能够相交的必要因素是K_{a,b}= (f[i] - f[q[tt]]) * (c[q[tt]] - c[q[tt - 1]])) tt--; q[++tt] = i; } // 输出 cout << f[n] << endl; return 0; }