题目:https://www.acwing.com/problem/content/304/
25个点就只TM错了一个,不知道问题出在哪儿
代码:
#include<bits/stdc++.h>
using namespace std;
int n,S;
long long t[300005],c[300005],f[300005],q[600005],head,tail;
int binary(int k)
{
long long l=head,r=tail;
while(l<r)
{
int mid=(l+r)/2;
if((f[q[mid+1]]-f[q[mid]])>k*(c[q[mid+1]]-c[q[mid]]))r=mid;
else l=mid+1;
}
return q[r];
}
int main()
{
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];
}
memset(f,0x3f,sizeof(f));
f[0]=0;
head=1,tail=n;
for(int i=1;i<=n;i++)
{
int j=binary(S+t[i]);
f[i]=f[j]-(S+t[i])*c[j]+t[i]*c[i]+S*c[n];
//cout<<head<<" "<<tail<<"\n";
while(head<tail&&(f[q[tail]]-f[q[tail-1]])*(c[i]-c[q[tail]])>=(f[i]-f[q[tail]])*(c[q[tail]]-c[q[tail-1]]))tail--;
q[++tail]=i;
}
cout<<f[n];
return 0;
}