斜率优化求改
  • 板块学术版
  • 楼主code_hyx
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/1/25 20:10
  • 上次更新2023/10/24 03:05:43
查看原帖
斜率优化求改
530797
code_hyx楼主2023/1/25 20:10

题目: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;
}

2023/1/25 20:10
加载中...