[CEOI 2004]锯木厂选址
Description
从山顶上到山底下沿着一条直线种植了 \(n\) 棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。
木材只能朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建这两个锯木厂,使得运输的费用总和最小。假定运输每公斤木材每米需要一分钱。询问计算最小运输费用。
\(1\leq n\leq 20000\)
Solution
记从山顶向下重量做一个前缀和为 \(w_i\),第 \(i\) 棵树到山底的距离为 \(d_i\),所有树到底端的距离乘重量的和为 \(sum\)。
枚举两个锯木厂位置 \(i,j(j<i)\)。显然答案就是 \(\max\{sum-w_j\times d_j-(w_i-w_j)\times d_i\}\)。
由于 \(w\) 和 \(d\) 的单调性相反,于是这个式子是可以斜率优化的,把 \(j\) 优化掉就可以 \(O(n)\) 求解了。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 20000+5;
int n, w[N], d[N], f[N], q[N], head, tail, tmp, ans;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &w[i], &d[i]);
for (int i = n; i >= 1; i--) d[i] += d[i+1], tmp += w[i]*d[i];
for (int i = 1; i <= n; i++) w[i] += w[i-1];
q[head = tail = 1] = 1;
for (int i = 2; i <= n; i++) {
while (head < tail && 1ll*w[q[head+1]]*d[q[head+1]]-w[q[head]]*d[q[head]]
>= 1ll*d[i]*(w[q[head+1]]-w[q[head]])) ++head;
ans = max(ans, w[q[head]]*d[q[head]]-d[i]*w[q[head]]+w[i]*d[i]);
while (head < tail && 1ll*(w[i]*d[i]-w[q[tail-1]]*d[q[tail-1]])*(w[i]-w[q[tail]])
<= 1ll*(w[i]*d[i]-w[q[tail]]*d[q[tail]])*(w[i]-w[q[tail-1]])) --tail;
q[++tail] = i;
}
printf("%d\n", tmp-ans);
return 0;
}
[CEOI 2004]锯木厂选址的更多相关文章
- 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)
[BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...
- P4360 [CEOI2004]锯木厂选址
P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...
- luoguP4360 [CEOI2004]锯木厂选址
题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...
- LG4360 [CEOI2004]锯木厂选址
题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
- [BZOJ2684][CEOI2004]锯木厂选址
BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...
- 【CEOI2004】锯木厂选址
[题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个 ...
- luogu4360 锯木厂选址 (斜率优化dp)
设: sw[i]为1..i的w之和 sd[i]为1到i的距离 cost[i]为把第一个锯木厂建在i带来的花费 all[i,j]为把i..j所有木头运到j所需要的花费 所以$all[i,j]=cost[ ...
- cogs 362. [CEOI2004]锯木厂选址
★★★ 输入文件:two.in 输出文件:two.out 简单对比 时间限制:0.1 s 内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...
随机推荐
- javascript 删除对象的属性 delete
1.当属性存在 configurable:true delete命令会返回true var obj={a:1}; delete obj.a //true console.log(obj);//{} 2 ...
- 【CSS选择器】
" 目录 一.介绍 二.语法 三.引入方式 1. 行内样式 2. 嵌入式 3. 外部样式 四.选择器 1. 基本选择器 2. 组合选择器 3. 属性选择器 4. 不常用选择器 5. 分组和嵌 ...
- DBC物品中打包物品参数设置
DBC库中添加某物品包或捆,主要修改以下这两地方: 物品DBC: Stdmode字段 填写31表示捆或包 Shape字段 表示解开后的物品,填写时需要先在你的服务端文件里面找到UnbindList ...
- js函数声明外面使用小括号括起来再接一个小括号的写法
js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...
- leetCode练题——38. Count and Say
1.题目 38. Count and Say The count-and-say sequence is the sequence of integers with the first five te ...
- 关于OSPF LSA不稳定!
Issue 1 Solution It is important that you understand the error message during attempts to troublesho ...
- Wireless-MCS
MCS是modulation and coding scheme的缩写,可以翻译为调制和编码格式,我们可以选择配置该参数,来选择AP和Client之间传输的MCS rate,这些数据速率是使用shor ...
- ANSYS 瞬态热分析--样件加热
目录 1. 要求 2. ANSYS有限元分析 2.1 APDL建模 1. 要求 一块0.8m*0.4m*0.2m厚的钢板,在300℃的炉子中进行加热,其材料参数如下表所示: 材料参数 序号 名称 参数 ...
- Python学习第二十五课——Mysql (多表查询)
多表查询: 内连接查询: 首先:创建两个表一个为tableA,一个为tableB,并且插入数据(代码省略) 同时查询两个表的记录: select * from tableA,tableB; 根据tab ...
- sparksql报错
执行时报错: org.apache.spark.sql.AnalysisException: Unable to generate an encoder for inner class `cn.itc ...