任务安排3 斜率优化DP

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务安排3 斜率优化DP相关的知识,希望对你有一定的参考价值。

任务安排2

任务安排3

1 ≤ N ≤ 3 × 105 , 1≤N≤3×105, 1N3×105,
0 ≤ S , C i ≤ 512 , 0≤S,Ci≤512, 0S,Ci512,
− 512 ≤ T i ≤ 512 −512≤Ti≤512 512Ti512
此题和上面的2相比,仅仅变了 T T T可以是负数

是负数的话,对凸包上的点查询就不能对队首进行操作了,需要二分查找这个点,查找凸包上第一条大于等于该直线的斜率的直线,因为直线的斜率不是单增的了。
其余的都一样

代码:

因为在acwing上做的,数据加强了,需要使用double类型

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5+5;
ll c[N],t[N],q[N];
ll n,s;
double f[N];
int main()
{
    scanf("%lld%lld",&n,&s);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&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++)
    {
        int l=hh,r=tt;
        while(l<r)
        {
            int mid = l+r>>1;
            if(f[q[mid+1]]-f[q[mid]]>(t[i]+s)*(c[q[mid+1]]-c[q[mid]])) r = mid;
            else l = mid + 1;
        }
        int j = q[r];
        f[i] = f[j]-(t[i]+s)*c[j]+t[i]*c[i]+s*c[n];
        while(hh<tt && (f[q[tt]]-f[q[tt-1]])*(c[i]-c[q[tt]]) >= (f[i]-f[q[tt]])*(c[q[tt]]-c[q[tt-1]])) --tt;
        q[++tt] = i;
    }
    printf("%.0lf\\n",f[n]);
    return 0;
}

以上是关于任务安排3 斜率优化DP的主要内容,如果未能解决你的问题,请参考以下文章

P2365 任务安排 / [FJOI2019]batch(斜率优化dp)

任务安排2 斜率优化DP

[SDOI2012]任务安排 - 斜率优化dp

洛谷P2365 任务安排 [解法二 斜率优化]

任务安排1 斜率优化DP

BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]