bzoj 2726: [SDOI2012]任务安排
Description
Input
Output
Sample Input
1 3
3 2
4 3
2 3
1 4
Sample Output
HINT
Source
这个题一开始想着去处理一个人等了多长时间
然后就会发现等的时间是和前面分了多少批有关的,这样的话我们需要用二维状态表示到这个点,前面分了多少批
这样暴力n^3会很萎
这时候我们会回想起一个叫做修车的题目,他对于每个点的处理相当于是这个点让后面的人多等了多久
那我们可以通过同样的方式思考,每分了一批其实就是让后面的所有人多等了一个S的时间,其余的并不影响
那么我们可以推出一维的状态
f[i]=min(f[j]+s*(F[n]-F[j])+T[i]*(F[i]-F[j]));
对于前百分之60的数据,T为正数,满足决策单调性,可以二分栈,但我懒得打了,就在codevs上AC了一个弱化版的n^2;
斜率优化+CDQ在下面
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<set>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#define lson num<<1
#define rson num<<1|1
#define int long long
using namespace std;
typedef long long ll;
const int N=100050;
int gi()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}
int f[N],t[N],F[N],s,n;
int cal(int j,int i){
return f[j]+s*(F[n]-F[j])+t[i]*(F[i]-F[j]);
}
main()
{
n=gi(),s=gi();
for(int i=1;i<=n;i++) t[i]=gi()+t[i-1],F[i]=gi()+F[i-1];
for(int i=1;i<=n;i++){
f[i]=cal(0,i);
for(int j=1;j<i;j++){
f[i]=min(f[i],cal(j,i));
}
}
printf("%lld",f[n]);
}
我们来推一推斜率方程:
f[j]+s*(F[n]-F[j])+T[i]*(F[i]-F[j)<=f[k]+s*(F[n]-F[k])+T[i]*(F[i]-F[k]);
f[j]+s*F[n]-s*F[j]+T[i]*F[i]-T[i]*F[j]<=f[k]+s*F[n]-s*F[k]+T[i]*F[i]-T[i]*F[k];
f[j]-s*F[j]-T[i]*F[j]<=f[k]-s*F[k]-T[i]*F[k];
令Y(j)=f[j]-s*F[j];
令X(j)=F[j];
则变为:
Y(j)-T[i]*X(j)<=Y(k)-T[i]*X(k);
T[i]*(X(k)-X(j))<=Y(k)-Y(j);
若X(k)>=X(j):T[i]<=(Y(k)-Y(j))/(X(k)-X(j));
若X(k)<=X(j);T[i]>=(Y(k)-Y(j))/(X(k)-X(j));
因为F值都是正的,所以X(k)>=X(j);横坐标单调;
所以T[i]<=(Y(k)-Y(j))/(X(k)-X(j));
然而斜率T[i]不是单调的
然后我就不会做了
上面的点的做法就是在瞎哔哔;
下面介绍线的神教:
方程:f[j]+s*(F[n]-F[j])+T[i]*(F[i]-F[j])
展开:
f[j]+s*F[n]-s*F[j]+T[i]*F[i]-T[i]*F[j]
整理:
f[j]-s*F[j]+s*F[n]+T[i]*F[i]*T[i]-F[j]*T[i]
利用线的套路转变:
b=f[j]-s*F[j];k=F[j];x=T[i],s*F[n]+F[i]*T[i]为常数
然后我们发现斜率k是满足单调性的,而横坐标x根据题意有负数是不满足单调性的。
这时候我们可以直接应用货币兑换的CDQ分治(把斜率和横坐标都不当成单调的搞):
在左边维护斜率单调构造半平面交
在右边维护横坐标单调进行决策转移
具体分析请参考货币兑换的博客,上面有详解
附上代码:
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<set>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#define lson num<<1
#define rson num<<1|1
#define int long long
using namespace std;
typedef long long ll;
const int N=300050;
int gi()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}
struct data {int k,x,b;int id;}g[N],q[N],p[N];
bool cmp(data a,data b){
return a.x<b.x;
}
int f[N],F[N],T[N],s,n;
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)>>1,l1=l,l2=mid+1,head=1,tail=0;
for(int i=l;i<=r;i++){
if(g[i].id<=mid) p[l1++]=g[i];
else p[l2++]=g[i];
}
for(int i=l;i<=r;i++) g[i]=p[i];
solve(l,mid);
for(int i=l;i<=mid;i++){
while(head<tail&&(g[i].k-q[tail-1].k)*(q[tail-1].b-q[tail].b)>=(q[tail].k-q[tail-1].k)*(q[tail-1].b-g[i].b))
tail--;
q[++tail]=g[i];
}
//sort(g+mid+1,g+r+1,cmp);
for(int i=mid+1;i<=r;i++){
while(head<tail&&q[head].k*g[i].x+q[head].b>=q[head+1].k*g[i].x+q[head+1].b)
head++;
f[g[i].id]=min(f[g[i].id],q[head].k*g[i].x+q[head].b+T[g[i].id]*F[g[i].id]+s*F[n]);
g[i].b=f[g[i].id]-s*F[g[i].id];
}
solve(mid+1,r);l1=l,l2=mid+1;
for(int i=l;i<=r;i++){
if(l2>r||(l1<=mid&&g[l1].k>=g[l2].k)) p[i]=g[l1++];
else p[i]=g[l2++];
}
for(int i=l;i<=r;i++) g[i]=p[i];
}
main()
{
n=gi(),s=gi();
for(int i=1;i<=n;i++){
T[i]=gi()+T[i-1];
F[i]=gi()+F[i-1];
g[i].id=i,g[i].k=-F[i],g[i].x=T[i];
}
for(int i=1;i<=n;i++) f[i]=s*F[n]+T[i]*F[i],g[i].b=f[i]-s*F[i];
sort(g+1,g+n+1,cmp);solve(1,n);
printf("%lld",f[n]);
}
bzoj 2726: [SDOI2012]任务安排的更多相关文章
- BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. 与j有关 ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...
- bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】
cdq复健.jpg 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: \[ f[i]=min(f[j]+s*(sf[n]-sf[j])+st[i]*(sf[i]-sf[j])) \] 然后移项 ...
- BZOJ.2726.[SDOI2012]任务安排(DP 斜率优化)
题目链接 数据范围在这:https://lydsy.com/JudgeOnline/wttl/thread.php?tid=613, 另外是\(n\leq3\times10^5\). 用\(t_i\) ...
- BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp
题解 转移方程与我的上一篇题解一样 : $S\times sumC_j + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$. 分离成:$S\t ...
- BZOJ 2726: [SDOI2012]任务安排 斜率优化 + 凸壳二分 + 卡精
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- [bzoj P2726] [SDOI2012]任务安排
[bzoj P2726] [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1204 Solved: 349[Submit] ...
- Bzoj 2726 SDOI 任务安排
Memory Limit: 131072KB 64bit IO Format: %lld & %llu Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务 ...
随机推荐
- 二叉树、栈、队列、链表的Java代码实现
这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...
- SSM框架开发web项目系列(二) MyBatis真正的力量
前言 上篇SSM框架环境搭建篇,演示了我们进行web开发必不可少的一些配置和准备工作,如果这方面还有疑问的地方,可以先参考上一篇“SSM框架开发web项目系列(一) 环境搭建篇”.本文主要介绍MyBa ...
- nomad的简易集群
启动服务器 第一步是为服务器创建配置文件.无论是从下载的文件github,或粘贴到一个名为server.hcl: vim server.hcl # Increase log verbosity log ...
- This package contains perl-5.16.3, java8, nifi-1.1.2 on ubuntu:14.04
[How to build:]cd /home/ops/work/demo/docker/aws/srctouch Dockerfiledocker build -t aws_src_image:v1 ...
- 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别
背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...
- Nginx配置优化及深入讲解,大家可以听一下
随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数. 1) Nginx.conf配置优化: worker_proce ...
- 音频传输之Jitter Buffer设计与实现
在语音通信中Jitter Buffer(下面简称JB)是接收侧一个非常重要的模块,它是决定音质的重要因素之一.一方面它会把收到的乱序的语音包排好序放在buffer里正确的位置上,另一方面它把接收到的语 ...
- 三种方法实现PCA算法(Python)
主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...
- Microsoft Flow 概览
作者:陈希章 发表于 2017年12月15日 前言 纵观一下我们周围的世界,以及我们每天忙忙碌碌的工作,你会"惊奇地"发现它们都是一个事件接着一个事件发生的.例如,我每天早上起来, ...
- 实践作业3:白盒测试----我是如何写测试用例DAY6
一开始接到写白盒测试的任务,我感觉挺难的,因为感觉之前我所想到的都是黑盒测试啊,说到测试系统逻辑,感觉就有些神秘的样子没有思路了,那黑盒和白盒写的到底有啥区别.后来我请教了实验室的一个同学,他虽然还没 ...