【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治
【BZOJ2726】[SDOI2012]任务安排
Description
Input
Output
Sample Input
1 3
3 2
4 3
2 3
1 4
Sample Output
题解:用f[i]表示做完前i个任务的最小费用,但是做完当前任务的时间对后面的任务也会造成影响,所以我们提前应计算费用,不难列出方程:
设st表示T的前缀和,sf表示F的前缀和,所以有:
$f[i]=\min \{ f[j]+(st[i]-st[j]+S)*(sf[n]-sf[j])\}$
移个项显然就变成了斜率优化的形式。不过坑的地方是,T可能是负数,所以斜率不是单调的,所以用cdq分治即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=300010;
typedef long long ll;
typedef long double ld;
int n;
ll S;
struct node
{
int x,org,k;
ll y,f;
}s[maxn],p[maxn];
int q[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
bool cmpk(const node &a,const node &b)
{
return a.k>b.k;
}
bool cmpo(const node &a,const node &b)
{
return a.org<b.org;
}
inline ld slope(int a,int b)
{
if(s[a].x==s[b].x) return (s[b].y>=s[a].y)?(1e20):(-1e20);
else return ld(s[b].y-s[a].y)/(s[b].x-s[a].x);
}
void solve(int l,int r)
{
if(l==r)
{
s[l].y=(ll)s[l].x*(s[l].k-S)-s[l].f;
return ;
}
register int mid=(l+r)>>1,i,h1=l,h2=mid+1;
for(i=l;i<=r;i++)
{
if(s[i].org<=mid) p[h1++]=s[i];
else p[h2++]=s[i];
}
for(i=l;i<=r;i++) s[i]=p[i];
solve(l,mid);
register int h=1,t=0;
for(i=l;i<=mid;i++)
{
while(h<t&&slope(q[t],i)>=slope(q[t-1],q[t])) t--;
q[++t]=i;
}
for(i=mid+1;i<=r;i++)
{
while(h<t&&slope(q[h],q[h+1])>=s[i].k) h++;
s[i].f=min(s[i].f,s[q[h]].f+s[q[h]].x*(s[i].k-s[q[h]].k+S));
}
solve(mid+1,r);
h1=l,h2=mid+1;
for(i=l;i<=r;i++)
{
if(h1<=mid&&(h2>r||s[h1].x<s[h2].x)) p[i]=s[h1++];
else p[i]=s[h2++];
}
for(i=l;i<=r;i++) s[i]=p[i];
}
int main()
{
n=rd(),S=rd();
int i;
for(i=1;i<=n;i++) s[i].k=s[i-1].k+rd(),s[i-1].x=rd(),s[i].org=i;
for(i=n-1;i>=0;i--) s[i].x+=s[i+1].x;
for(i=1;i<=n;i++) s[i].f=s[0].x*(s[i].k+S);
sort(s+1,s+n+1,cmpk);
solve(1,n);
sort(s+1,s+n+1,cmpo);
printf("%lld",s[n].f);
return 0;
}
【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治的更多相关文章
- [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算
题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...
- BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】
题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...
- [Noi2014]购票 BZOJ3672 点分治+斜率优化+CDQ分治
Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...
- 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3396 Solved: 1434[Submit][Sta ...
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...
- BZOJ3963 WF2011MachineWorks(动态规划+斜率优化+cdq分治)
按卖出时间排序后,设f[i]为买下第i台机器后的当前最大收益,则显然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,应设为-inf以表示无法购买第i台机器. ...
- bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)
设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
随机推荐
- MySQL主从配置的一些总结
有很多朋友做了mysql主从也有一段时间了,但是有时候也走了不少弯路,时间也浪费了不少,主要问题是没有查阅其他的主机配置的相关资料,而仅仅是看了配置文档,下面是作者对主从配置的一些总结. AD: 20 ...
- 详解php的安装模式---CGI,FASTCGI,php-fpm,mod_php,mod_cgi,mod_fcgid
1. CGI CGI是通用网关接口,HTTP服务器使用这样的接口程序来和“其他程序”(比如PHP的解释器程序)通讯,这个“其他程序”可以使用任何计算机语言来编写,它通过CGI这个接口从HTTP服务器取 ...
- SPD
一般是在内存条上的.1.SPD是SERIAL PRESENCE DETECT的缩写,中文意思是模组存在的串行检测.也即是通过上面讲的IIC串行接口的EEPROM对内存插槽中的模组存在的信息检查.这样的 ...
- [svc]linux测速软件speedtest-cli
linux测速软件: https://github.com/sivel/speedtest-cli 以下是我在gentoo上测的
- Decoration5:引入Actuator进行站点监控
1.添加依赖 2.重启应用 3.下图显示了一些默认的监控端点 这是数据可以在前台用来做饼图和柱状图什么的,不过实际上我们现在还用不到,于是就不深入研究
- 每日英语:Asia Has World's Biggest Pay Gap, Study Finds
In Asia, middle managers such as department heads make more than 14 times as much as operational emp ...
- WannaCry病毒应急处置
WannaCry病毒应急处置 病毒介绍 近期勒索病毒WannaCry大面积爆发,并迅速蔓延.被感染的机器,病毒会自动加密系统中的图片.文档.音频.视频等几乎所有类型的文件,必须缴纳高额勒索金(人民 ...
- Django Rest Framework(分页、视图、路由、渲染器)
一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于lim ...
- centos7下忘记mysql5.7密码
才装完的mysql,转眼密码就忘记了,找了一圈的修改密码方法,做下记录! 编辑mysql配置文件. [root@localhost ~]# vi /etc/my.cnf 在[mysqld]配置节下新增 ...
- 基于HTML5 Canvas 实现的 Loading 效果
Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...