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]锯木厂选址的更多相关文章

  1. 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)

    [BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...

  2. P4360 [CEOI2004]锯木厂选址

    P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...

  3. luoguP4360 [CEOI2004]锯木厂选址

    题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...

  4. LG4360 [CEOI2004]锯木厂选址

    题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...

  5. 动态规划(斜率优化):[CEOI2004]锯木厂选址

    锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...

  6. [BZOJ2684][CEOI2004]锯木厂选址

    BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...

  7. 【CEOI2004】锯木厂选址

    [题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个 ...

  8. luogu4360 锯木厂选址 (斜率优化dp)

    设: sw[i]为1..i的w之和 sd[i]为1到i的距离 cost[i]为把第一个锯木厂建在i带来的花费 all[i,j]为把i..j所有木头运到j所需要的花费 所以$all[i,j]=cost[ ...

  9. cogs 362. [CEOI2004]锯木厂选址

    ★★★   输入文件:two.in   输出文件:two.out   简单对比 时间限制:0.1 s   内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...

随机推荐

  1. jmeter plugin manager安装插件

    https://jmeter-plugins.org/wiki/PluginsManager/ 以websocket 插件为例 先安装plugin manger 第二步:打开jmetre  optio ...

  2. Python学习之Craps赌博游戏篇

    在此先安利一波大佬的Python学习项目地址:https://github.com/jackfrued/Python-100-Days 这些天一直在看着大佬的项目学习Python,这是第五天循环学习完 ...

  3. Java代码三级跳——表达式、语句和代码块

    Java代码三级跳—表达式.语句和代码块 表达式(expression):Java中最基本的一个运算.比如一个加法运算表达式.1+2是一个表达式,a+b也是. 语句(statement):类似于平时说 ...

  4. python web django 2nd level -- 待更新

    练习代码位置 实例代码位置 --> app: myblog Form 利用Form表单验证,自己写的html 思路: 新建一个类 LoginForm(forms.Form) 新建对象 obj = ...

  5. STM32F103之GPIO学习记录

    9 GPIO:通用I/O口 AFIO:可供选择的I/O口 9.1 GPIO功能描述 每一个通用的I/O口都有: 两个32位的配置寄存器(配置寄存器低和配置寄存器高): 两个32位的数据寄存器(输入数据 ...

  6. rosserial学习记录

    1.参考博客:rosserial移植到STM32(CUBEMX+HAL库) 网址:https://blog.csdn.net/qq_37416258/article/details/84844051 ...

  7. js正则验证表达式验证

    /* 合法uri */ export function validateURL(textval) {  const urlregex = /^(?:http(s)?:\/\/)?[\w.-]+(?:\ ...

  8. Chrome浏览器切页快捷键

    Chrome浏览器切换标签页快捷键 1.Ctrl + Tab 向左切换标签页 2.Ctrl + shift + Tab 向右切换 3.Ctrl + 1 切换到第一个页面 4.Ctrl + 9 切换到最 ...

  9. Python爬虫教程:requests模拟登陆github

    1. Cookie 介绍 HTTP 协议是无状态的.因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信.Cookie 就是「其他手段」之一. Cookie 一个典型的应用场景,就是 ...

  10. PTA的Python练习题(十三)

    第4章-8 求分数序列前N项和 a=eval(input()) b=2 c=1 d=0 count=0 for i in range(a): count+=b/c d=b b=b+c c=d prin ...