任务安排3 斜率优化DP
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务安排3 斜率优化DP相关的知识,希望对你有一定的参考价值。
任务安排2
任务安排3
1
≤
N
≤
3
×
105
,
1≤N≤3×105,
1≤N≤3×105,
0
≤
S
,
C
i
≤
512
,
0≤S,Ci≤512,
0≤S,Ci≤512,
−
512
≤
T
i
≤
512
−512≤Ti≤512
−512≤Ti≤512
此题和上面的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的主要内容,如果未能解决你的问题,请参考以下文章