@题目描述@

春春是一名道路工程师,负责铺设一条长度为 n 的道路。

铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di。

春春每天可以选择一段连续区间 [L,R],填充这段区间中的每块区域,让其下陷深度减少 1。在选择区间时,需要保证,区间内的每块区域在填充前下陷深度均不为 0。

春春希望你能帮他设计一种方案,可以在最短的时间内将整段道路的下陷深度都变为 0 。

输入

输入文件包含两行,第一行包含一个整数 n,表示道路的长度。 第二行包含 n 个整数,相邻两数间用一个空格隔开,第 i 个整数为 di。

输出

输出文件仅包含一个整数,即最少需要多少天才能完成任务。

输入样例#1:

6

4 3 2 5 3 5

输出样例#1:

9

样例解释1:

一种可行的最佳方案是,依次选择: [1,6]、[1,6]、[1,2]、[1,1]、[4,6]、[4,4]、[4,4]、[6,6]、[6,6]。

数据规模与约定

对于 30% 的数据,1 ≤ n ≤ 10;

对于 70% 的数据,1 ≤ n ≤ 1000;

对于 100% 的数据,1 ≤ n ≤ 100000 , 0 ≤ di ≤ 10000。

@考场上的思路@

我 抄 我 自 己?

虽然这是 NOIP2013 的原题“积木游戏”……然而我并没有做过-_-

所以考场上想了一个比较复杂的解:

显然观察样例,我们可以贪心地这样做:对于某一个区间,选择最小值,将这个区间减去这个最小值,然后把区间按照这个最小值分为两个区间分治求解。

因此,本来想写线段树来着……但是我及时地发现(其实是因为不想写再多想会儿hhhh)区间的最小值是不会变化的。也就是说我们可以不去动态查询区间最小值,而是建成笛卡尔树,再在笛卡尔树上进行操作。

代码(不建议参考,建议继续往后看正常的解):

#include<cstdio>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN = 100000;
const int MAXD = 10000;
struct node{
ll ans; int d;
node *ch[2];
}tree[MAXN + 5], *tcnt, *NIL, *root;
void init() {
root = NIL = tcnt = &tree[0];
NIL->ch[0] = NIL->ch[1] = NIL;
}
node *newnode(int d) {
tcnt++;
tcnt->d = d; tcnt->ch[0] = tcnt->ch[1] = NIL;
return tcnt;
}
stack<node*>stk;
int d[MAXN + 5];
void dfs(node *rt, int x) {
if( rt == NIL ) return ;
dfs(rt->ch[0], rt->d);
dfs(rt->ch[1], rt->d);
rt->ans = rt->ch[0]->ans + rt->ch[1]->ans + (rt->d - x);
}
int main() {
init(); int n;
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d", &d[i]);
for(int i=1;i<=n;i++) {
node *nw = newnode(d[i]), *lst = NIL;
while( !stk.empty() && stk.top()->d > nw->d ) {
lst = stk.top();
stk.pop();
}
if( !stk.empty() ) stk.top()->ch[1] = nw;
nw->ch[0] = lst;
stk.push(nw);
}
while( !stk.empty() ) {
root = stk.top();
stk.pop();
}
dfs(root, 0);
printf("%lld\n", root->ans);
return 0;
}

@比较正常的题解@

我们实际上是求如图的块的个数。



我们不妨在块的右端点去统计每一块对答案的贡献。

所以就很简单了:

(1)如果 d[i] >= d[i+1],则 ans+=(d[i]-d[i+1])

(2)如果 d[i] < d[i+1],则 continue

最后 ans+= d[n] 即可

#include<cstdio>
typedef long long ll;
const int MAXN = 100000;
int d[MAXN + 5];
int main() {
int n; ll ans = 0;
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d", &d[i]);
for(int i=1;i<n;i++)
if( d[i] >= d[i+1] ) ans += d[i] - d[i+1];
ans += d[n];
printf("%lld\n", ans);
}

@NOIP2018 - D1T1@ 铺设道路的更多相关文章

  1. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

  2. 题解【洛谷P5019】[NOIP2018]铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  3. 洛谷P5019 [NOIP2018 提高组] 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...

  4. NOIP2018Day1T1 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  5. 洛谷 P5019 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  6. NOIP2018D1T1 铺设道路

    原题:NOIP2013D1T1 积木大赛 题目地址:P5019 铺设道路 思路:玄学瞎搞 将每块区域插入一个小根堆,这里的小根堆用优先队列实现,即运用一个 \(pair\) , \(first\) 为 ...

  7. NOIP提高组2018试题解析 Day1 T1 铺设道路 P5019

    题目描述 春春是一名道路工程师,负责铺设一条长度为 nn 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 nn 块首尾相连的区域,一开始,第 ii 块区域下陷的深度为 d_idi​  ...

  8. 洛谷 P5019 铺设道路 & [NOIP2018提高组](贪心)

    题目链接 https://www.luogu.org/problem/P5019 解题思路 一道典型的贪心题. 假设从左往右填坑,如果第i个深与第i+1个,那么第i+1个就不需要额外填: 如果第i+1 ...

  9. 【比赛】NOIP2018 铺设道路

    原题,而且还是CCF自己的 考虑对于一段最长不上升序列,无论如何都至少有序列第一个数的贡献,可以知道,这个贡献是可以做到且最少的 然后对于序列最后一位,也就是最小的那一个数,可以和后面序列拼起来的就拼 ...

随机推荐

  1. 移动web--移动屏幕适配-完整的viewport设置

  2. SpringCloud-微服务的注册与发现Eureka

    一.SpringCloud简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  3. CentOS7配置中文支持与部署GitLab服务器

    给你的 CentOS 7 安装中文支持 1.首先需要中文字体以便支持命令行终端的中文显示需求: yum groupinstall "fonts" 碰到提示输入 y 回车继续安装,大 ...

  4. Oracle存储函数,存储过程

    一.Oracle存储函数:存储的PL/SQL语法块,完成特定的功能.1.语法: 函数关键字: function (1)创建函数 CREATE [OR REPLACE] FUNCTION <fun ...

  5. Js 克隆

    1.浅表克隆 调用concate() 或者slice() 方法,可以创建数组的浅表副本,在浅表副本中,如果原始数组的元素是复杂数据类型,则元素值指向对象的引用而非对象本身, 与原始数组一样,浅表副本的 ...

  6. ML面试1000题系列(91-100)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 91 简单说说RNN的原理?我们升学到高三准备高 ...

  7. web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理

    1.Javascript函数-了解函数的用途 1.1.函数: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 2.Javascript函数-定义函数 2.1.function必须小写 3. ...

  8. LintCode_181 将整数A转换为B

    题目 如果要将整数A转换为B,需要改变多少个bit位? 如把31转换为14,需要改变2个bit位. ()10=()2 ()10=()2 思路 要考虑负数的问题 如果 一正一负 将他们去全部变成正数 后 ...

  9. 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」

    之前的这篇文章「从0开始学习 GitHub 系列之「Git速成」」相信大家都已经对 Git 的基本操作熟悉了,但是这篇文章只介绍了对本地 Git 仓库的基本操作,今天我就来介绍下如何跟远程仓库一起协作 ...

  10. 为什么不用原生的Spring Cloud Config

    引言 近几年传统应用架构已经逐渐朝着微服务架构演进.那么随着业务的发展,微服务越来越庞大,此时服务配置的管理变得会复杂起来.为了方便服务配置文件统一管理,实时更新,配置中心应运而生.其实,所谓配置中心 ...