bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】
cdq复健.jpg
首先列个n方递推,设sf是f的前缀和,st是t的前缀和:
\]
然后移项:
\]
\]
\]
\]
然后看成斜率表达式b+kx=y,那么
\]
然后因为有负数所以这并不能用单调队列,splay是很方便但是又太长了
选择cdq
和bzoj 1492差不多,只是上凸壳变成下凸壳了,详见https://www.cnblogs.com/lokiii/p/9199587.html
注意!!转移的时候不是f[i]而是f[a[i].id]!!!我简直zz……
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const long long N=500005,inf=1e18;
long long n,s[N],m,dz,f[N];
struct dian
{
double x,y;
bool operator < (const dian &b) const
{
return (x<=b.x)||(x==b.x&&y<=b.y);
}
}p[N],q[N];
struct qwe
{
long long st,sf,k,id;
}a[N],b[N];
bool cmp(const qwe &a,const qwe &b)
{
return a.k<b.k;
}
long long read()
{
long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
double wk(long long i,long long j)
{
return (p[i].y-p[j].y)/(p[i].x-p[j].x);
}
void cdq(long long l,long long r)
{
if(l==r)
{
f[l]=min(f[l],(long long)(dz+a[l].st*a[l].sf));
p[l].x=a[l].sf;
p[l].y=f[l];
return;
}
long long mid=(l+r)>>1,top=0,l1=l,l2=mid+1;
for(long long i=l;i<=r;i++)
{
if(a[i].id<=mid)
b[l1++]=a[i];
else
b[l2++]=a[i];
}
for(long long i=l;i<=r;i++)
a[i]=b[i];
cdq(l,mid);
for(long long i=l;i<=mid;i++)
{
while(top>1&&wk(i,s[top])<wk(s[top],s[top-1]))
top--;
s[++top]=i;
}//cerr<<top<<endl;
for(long long i=mid+1,j=1;i<=r;i++)
{
while(j<top&&wk(s[j+1],s[j])<(double)a[i].k)
j++;//cerr<<i<<" "<<s[j]<<endl;
f[a[i].id]=min(f[a[i].id],(long long)(p[s[j]].y+dz+a[i].st*a[i].sf-p[s[j]].x*(m+a[i].st)));
}
cdq(mid+1,r);
l1=l,l2=mid+1;
for(long long i=l;i<=r;i++)
{
if((p[l1]<p[l2]||l2>r)&&l1<=mid)
q[i]=p[l1++];
else
q[i]=p[l2++];
}
for(long long i=l;i<=r;i++)
p[i]=q[i];
}
int main()
{
n=read(),m=read();
for(long long i=1;i<=n;i++)
a[i].st=a[i-1].st+read(),a[i].sf=a[i-1].sf+read(),a[i].k=m+a[i].st,a[i].id=i;
dz=m*a[n].sf;//cerr<<dz<<"!"<<endl;
sort(a+1,a+1+n,cmp);
for(long long i=1;i<=n;i++)
f[i]=inf;
cdq(1,n);
// for(int i=1;i<=n;i++)
// cerr<<f[i]<<endl;
printf("%lld\n",f[n]);
return 0;
}
bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】的更多相关文章
- BZOJ.2726.[SDOI2012]任务安排(DP 斜率优化)
题目链接 数据范围在这:https://lydsy.com/JudgeOnline/wttl/thread.php?tid=613, 另外是\(n\leq3\times10^5\). 用\(t_i\) ...
- bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...
- BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. 与j有关 ...
- BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】
题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
- [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找
网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...
- BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp
题解 转移方程与我的上一篇题解一样 : $S\times sumC_j + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$. 分离成:$S\t ...
随机推荐
- NYOJ-851寻找最大数(二),栈贪心!
寻找最大数(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大. 输入 ...
- Node.js & module system
Node.js & module system Node.js v10.9.0 Documentation https://nodejs.org/api/modules.html#module ...
- noip模拟赛 Nephren Ruq Insania
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 注意:本题大样例4的输出文件修改为 https://pan.baidu.com/s/1b ...
- POJ1276 Cash Machine
Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %lld & %llu Description A Bank pla ...
- 51Nod——T 1686 第K大区间
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...
- Java 添加、更新和移除PDF超链接
简介 PDF超链接用一个简单的链接包含了大量的信息,满足了人们在不占用太多空间的情况下渲染外部信息的需求.下面将介绍通过Java 在PDF中添加.更新和移除超链接. (一)工具使用: Free Spi ...
- SQL Server中迁移数据的几种方法
1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的 ...
- 七牛云上传图片到cdn,cdn返回的是一个只有图片的url
如:
- css 實現微信聊天類似的氣泡
要實現這樣的效果 代碼如下: --------------------------------------- <style> .test{width:300px; padding:30px ...
- C#之快速排序 C#之插入排序 C#之选择排序 C#之冒泡排序
C#之快速排序 算法描述 1.假定数组首位元素为“枢轴”,设定数列首位(begin)与末位(end)索引: 2.由末位索引对应元素与“枢轴”进行比较,如果末位索引对应元素大于“枢轴”元素,对末位索 ...