@题目描述@

春春是一名道路工程师,负责铺设一条长度为 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. LTIME16小结(CodeChef)

    题目链接 最后一题是Splay...还没有学会..蒟蒻!!! A /****************************************************************** ...

  2. linux目录结构详细说明

    Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...

  3. Oracle时间一串数字转为日期格式

    一.前台处理 js中接收到后台返回的json字符串中的日期类型的字段都变成了一串数字,例如:1500341149000.所以我们需要将这个串格式化形如:2017-07-18 09:25:49. 1.首 ...

  4. GYM 101350 F. Monkeying Around

    F. Monkeying Around time limit per test 2.0 s memory limit per test 256 MB input standard input outp ...

  5. redis书籍

    redis中文官网命令网址:http://doc.redisfans.com/ redis英文官网命令网址:https://redis.io/commands redis书籍 由 Karl Segui ...

  6. zoj 1028 Flip and Shift(数学)

    Flip and Shift Time Limit: 2 Seconds      Memory Limit: 65536 KB This puzzle consists of a random se ...

  7. 拦截导弹 (最长上升子序列LIS)

    #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; ] ...

  8. freemarker自定义标签(与java合用)

    自定义类继承FreemarkerManager类,重写protected Configuration createConfiguration(ServletContext servletContext ...

  9. 用Direct2D和DWM来做简单的动画效果2

    原文:用Direct2D和DWM来做简单的动画效果2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detai ...

  10. SQL优化系列(一)- 优化SQL

     优化SQL SQL开发人员从源代码中发现一条跑得很慢的SQL, 如何优化? DBA从AWR报告中发现一条跑得很慢的SQL,没有源代码或者不想修改源代码怎么办? SQL自动优化工具SQL Tuning ...