@题目描述@

春春是一名道路工程师,负责铺设一条长度为 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)区间的最小值是不会变化的。也就是说我们可以不去动态查询区间最小值,而是建成笛卡尔树,再在笛卡尔树上进行操作。

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

  1. #include<cstdio>
  2. #include<stack>
  3. using namespace std;
  4. typedef long long ll;
  5. const int MAXN = 100000;
  6. const int MAXD = 10000;
  7. struct node{
  8. ll ans; int d;
  9. node *ch[2];
  10. }tree[MAXN + 5], *tcnt, *NIL, *root;
  11. void init() {
  12. root = NIL = tcnt = &tree[0];
  13. NIL->ch[0] = NIL->ch[1] = NIL;
  14. }
  15. node *newnode(int d) {
  16. tcnt++;
  17. tcnt->d = d; tcnt->ch[0] = tcnt->ch[1] = NIL;
  18. return tcnt;
  19. }
  20. stack<node*>stk;
  21. int d[MAXN + 5];
  22. void dfs(node *rt, int x) {
  23. if( rt == NIL ) return ;
  24. dfs(rt->ch[0], rt->d);
  25. dfs(rt->ch[1], rt->d);
  26. rt->ans = rt->ch[0]->ans + rt->ch[1]->ans + (rt->d - x);
  27. }
  28. int main() {
  29. init(); int n;
  30. scanf("%d", &n);
  31. for(int i=1;i<=n;i++)
  32. scanf("%d", &d[i]);
  33. for(int i=1;i<=n;i++) {
  34. node *nw = newnode(d[i]), *lst = NIL;
  35. while( !stk.empty() && stk.top()->d > nw->d ) {
  36. lst = stk.top();
  37. stk.pop();
  38. }
  39. if( !stk.empty() ) stk.top()->ch[1] = nw;
  40. nw->ch[0] = lst;
  41. stk.push(nw);
  42. }
  43. while( !stk.empty() ) {
  44. root = stk.top();
  45. stk.pop();
  46. }
  47. dfs(root, 0);
  48. printf("%lld\n", root->ans);
  49. return 0;
  50. }

@比较正常的题解@

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



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

所以就很简单了:

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

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

最后 ans+= d[n] 即可

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int MAXN = 100000;
  4. int d[MAXN + 5];
  5. int main() {
  6. int n; ll ans = 0;
  7. scanf("%d", &n);
  8. for(int i=1;i<=n;i++)
  9. scanf("%d", &d[i]);
  10. for(int i=1;i<n;i++)
  11. if( d[i] >= d[i+1] ) ans += d[i] - d[i+1];
  12. ans += d[n];
  13. printf("%lld\n", ans);
  14. }

@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. css3动画曲线运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 【solr】SolrCloud中索引数据存储于HDFS

    SolrCloud中索引数据存储于HDFS 本人最近使用SolrCloud存储索引日志条件,便于快速索引,因为我的索引条件较多,每天日志记录较大,索引想到将日志存入到HDFS中,下面就说说怎么讲sol ...

  3. nfs网络共享服务基础

    nfs原理 1.开启RPC服务 2.NFS向RPC服务注册启动的端口 3.用户向RPC询问NFS服务的端口 4.RPC返回端口给客户端 5.客户端通过获得的端口与NFS服务器进行数据传输 实验步骤 一 ...

  4. Markdown图片

  5. 网站被攻击扫描SQL注入的日常记录

    我发了个博客,泄露了域名之后,便有人疯狂的尝试攻击我的站点,奈何我防守做得比较好,直接把网段封了,看到403还锲而不舍,我真是想给他颁奖了 查看ua,发现很多sqlmap的ua,肯定会是被刷了,只是运 ...

  6. 易语言调用外部DLL详细实例教程

    一.准备工作 一.工具:易语言 二.准备一个DLL 1)打开易语言-新建一个Windows动态链接库 2)然后右键新建一个子程序或者用快捷键:Ctrl+N .然后写上代码.我这里写一个 2个字符串拼接 ...

  7. Leetcode661.Image Smoother图片平滑器

    包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多 ...

  8. SpringCloud 融入 Python - Tornado

    前言 该篇文章分享如何将Python Web服务融入到Spring Cloud微服务体系中,并调用其服务,Python Web框架用的是Tornado 构建Python web服务 引入py-eure ...

  9. 电脑上做的ppt拿到别的电脑或手机上播放的时候字体错位的解决方法

    原因:字体不对!!! 比如你英文用的Calibri字体,但是手机的wps或者别的电脑上的低版本的office没有这个字体,所以就会强制转换成那里有的字体(一般是黑体),此时字体就会错位!! 不要以为那 ...

  10. 第一周<单元一聚类>

    K-means 聚类算法 初始随机选择 而后不断更新 kmeans 应用 省份归类 调用kmeans方法所需要的参数 n_clusters 指定的聚类中心 init 初始聚类中心的初始化方法 默认k- ...