luogu4360 锯木厂选址 (斜率优化dp)
设:
sw[i]为1..i的w之和
sd[i]为1到i的距离
cost[i]为把第一个锯木厂建在i带来的花费
all[i,j]为把i..j所有木头运到j所需要的花费
所以$all[i,j]=cost[j]-cost[i-1]-sw[i-1]*(sd[j]-sd[i-1])$
我们设第2个锯木厂建在i所带来的最小花费为f[i],则$f[i]=min\{cost[j]+all[j+1,i]+all[j+1,n+1]\}$
把all化掉,最终变成$f[i]=min\{cost[n+1]-sw[j]*(sd[i]-sd[j])-sw[i]*(sd[n+1]-sd[i])\}$
这样的话,如果直接做,复杂度是$O(n^2)$的
考虑优化,我们尝试比较在i固定时,f[j1]和f[j2]的值(j1<j2),$f[j1]-f[j2]=sw[j2]*(sd[i]-sd[j2])-sw[j1]*(sd[i]-sd[j1])$
先假设$f[j1]-f[j2]<0$,也就是j1是较优解
那么可以得到$\frac{sw[j1]*sd[j1]-sw[j2]*sd[j2]}{sw[j1]-sw[j2]}>sd[i]$
发现右端随i单增,而且左端呈现斜率的形式
那么也就是说,如果在某次i++以后,某两个j1,j2的斜率<sd[i],就可以确定j1永远不会是最优解了
那么可以维护一个队列,保证j1<j2<j3<... ,而且j1j2 ,j2j3 ,j3j4两两间的斜率递增
这样在每次i++的时候,先从队头向后把斜率<sd[i]的踢掉,之后的队头就是这次i的最优值
然后在统计完i的答案以后,i也可以作为第一个伐木厂了,就把它按照性质从队尾插进去
也就是说,对于队尾的两个元素t-1和t,若t.i间斜率>t-1.t间斜率,直接把i插到队尾;
若不是,则踢掉t然后继续做(此时的t绝对不会是最优解了,因为t-1与i间斜率<t-1与t间斜率,则要么t-1比t和i都优,要么sd[i]先超过t-1与i间的斜率,然后i会优于t-1和t)
队列里只剩一个点的话就谈不来斜率了..就不做了...
然后做的时候可以把比较斜率的除法改成乘法,防止出锅
每个点最多进队一次,出队一次,所以复杂度是O(n)的
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<ctime>
#define LL long long int
using namespace std;
const int maxn=; LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,w[maxn],d[maxn];
LL sw[maxn],sd[maxn],cost;
int q[maxn],head,tail; inline bool judge1(int j1,int j2,int i){return sw[j1]*sd[j1]-sw[j2]*sd[j2]<sd[i]*(sw[j1]-sw[j2]);}
inline bool judge2(int j1,int j2,int j3){return (sw[j1]*sd[j1]-sw[j2]*sd[j2])*(sw[j2]-sw[j3])<(sw[j2]*sd[j2]-sw[j3]*sd[j3])*(sw[j1]-sw[j2]);}
inline int get(int i,int j){return cost-sw[j]*(sd[i]-sd[j])-sw[i]*(sd[N+]-sd[i]);} int main(){
int i,j,k;
N=rd();
for(i=;i<=N;i++){
w[i]=rd(),d[i]=rd();
sw[i]=sw[i-]+w[i];sd[i]=sd[i-]+d[i-];
cost+=sw[i-]*d[i-];
}cost+=sw[N]*d[N];sd[N+]=sd[N]+d[N];
head=tail=;q[]=;
int ans=2e9+;
for(i=;i<=N;i++){
while(head<tail&&(!judge1(q[head],q[head+],i))) head++;
ans=min(ans,get(i,q[head]));
while(tail>head&&(!judge2(q[tail-],q[tail],i))) tail--;
q[++tail]=i;
}printf("%d\n",ans); return ;
}
luogu4360 锯木厂选址 (斜率优化dp)的更多相关文章
- [CEOI2004]锯木厂选址 斜率优化DP
斜率优化DP 先考虑朴素DP方程, f[i][k]代表第k个厂建在i棵树那里的最小代价,最后答案为f[n+1][3]; f[i][k]=min(f[j][k-1] + 把j+1~i的树都运到i的代价) ...
- P4360 [CEOI2004]锯木厂选址
P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...
- 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)
[BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...
- luoguP4360 [CEOI2004]锯木厂选址
题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
- 洛谷4360[CEOI2004]锯木厂选址 (斜率优化+dp)
qwq 我感觉这都已经不算是斜率优化\(dp\)了,感觉更像是qwq一个\(下凸壳优化\)转移递推式子. qwq 首先我们先定义几个数组 \(sw[i]\)表示\(w[i]\)的前缀和 \(val[i ...
- 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...
- [BSOJ2684]锯木厂选址(斜率优化)
Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂 ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
随机推荐
- Luogu P1306 斐波那契公约数
这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞 ...
- [Spark][Python]sortByKey 例子
[Spark][Python]sortByKey 例子: [training@localhost ~]$ hdfs dfs -cat test02.txt00002 sku01000001 sku93 ...
- 一次线上redis实例cpu占用率过高问题优化(转)
前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然而然就把redis也挪到我 ...
- flask-socketio笔记
Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信. 客户端应用程序可以使用Javascript,C ++,Java和Swift中的任何SocketIO官方客户 ...
- C/C++中int128的那点事
最近群友对int128这个东西讨论的热火朝天的.讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分O ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
- Dell BOSS 卡是什么
全名: Boot Optimized Storage Solution 针对 M.2 接口的 SSD,主板上必须设计接口进行适配. 设计一款主板对于硬件厂商来说是有成本的,其中包括 主板设计成本 产品 ...
- iOS实时查看App运行日志
前言: 本文讨论如何实时查看输出在console控制台的日志. 一.Xcode 通过Window->Devices打开devices界面,选择我们的手机,也能看到手机中运行的进程输出的日志.如图 ...
- Promise 原理
异步:可同时好几件事,互不影响: 同步:按循序一件一件.... 异步好多缺点:.... promise就是解决异步计算的这些缺点的,主要用于: 1.异步计算: 2.可以将异步操作队列化 按期望的顺序 ...
- 基于SSH 供应链管理系统质量属性说明
产品的易用程度如何,执行速度如何,可靠性如何,当发生异常情况时,系统如何处理.这些被称为软件质量属性,而特性是指系统非功能(也叫非行为)部分的需求. 性能:性能就是一个东西有多快,通常指响应时间或延迟 ...