AcWing 301 任务安排2
能被y总设为困难的题果然都不是善茬,思维量很大的一道题,想了好几天,最后终于算是理解了,借鉴一下大佬的题解
大佬题解
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 10;
int n, S, m;
int sc[N], st[N];
int q[N];
int f[N];
signed main()
{
cin>>n>>S;
for(int i = 1; i <= n; i ++ ){
cin>>st[i]>>sc[i];
sc[i] += sc[i - 1];
st[i] += st[i - 1];
}
int hh = 0, tt = 0;
q[0] = 0;
for(int i = 1; i <= n; i ++ ){
while(hh < tt && (f[q[hh + 1]] - f[q[hh]]) <= (sc[q[hh + 1]] - sc[q[hh]]) * (S + st[i])) hh ++ ;
f[i] = f[q[hh]] + S * (sc[n] - sc[q[hh]]) + st[i] * (sc[i] - sc[q[hh]]);
while(hh < tt && (f[i] - f[q[tt]]) * (sc[q[tt]] - sc[q[tt - 1]]) <= (sc[i] - sc[q[tt]]) * (f[q[tt]] - f[q[tt - 1]])) tt -- ;
q[ ++ tt] = i;
}
cout<<f[n]<<endl;
return 0;
}