@NOIP2018 - D1T1@ 铺设道路
@题目描述@
春春是一名道路工程师,负责铺设一条长度为 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@ 铺设道路的更多相关文章
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- 题解【洛谷P5019】[NOIP2018]铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 洛谷P5019 [NOIP2018 提高组] 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...
- NOIP2018Day1T1 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- NOIP2018D1T1 铺设道路
原题:NOIP2013D1T1 积木大赛 题目地址:P5019 铺设道路 思路:玄学瞎搞 将每块区域插入一个小根堆,这里的小根堆用优先队列实现,即运用一个 \(pair\) , \(first\) 为 ...
- NOIP提高组2018试题解析 Day1 T1 铺设道路 P5019
题目描述 春春是一名道路工程师,负责铺设一条长度为 nn 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 nn 块首尾相连的区域,一开始,第 ii 块区域下陷的深度为 d_idi ...
- 洛谷 P5019 铺设道路 & [NOIP2018提高组](贪心)
题目链接 https://www.luogu.org/problem/P5019 解题思路 一道典型的贪心题. 假设从左往右填坑,如果第i个深与第i+1个,那么第i+1个就不需要额外填: 如果第i+1 ...
- 【比赛】NOIP2018 铺设道路
原题,而且还是CCF自己的 考虑对于一段最长不上升序列,无论如何都至少有序列第一个数的贡献,可以知道,这个贡献是可以做到且最少的 然后对于序列最后一位,也就是最小的那一个数,可以和后面序列拼起来的就拼 ...
随机推荐
- LTIME16小结(CodeChef)
题目链接 最后一题是Splay...还没有学会..蒟蒻!!! A /****************************************************************** ...
- linux目录结构详细说明
Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...
- Oracle时间一串数字转为日期格式
一.前台处理 js中接收到后台返回的json字符串中的日期类型的字段都变成了一串数字,例如:1500341149000.所以我们需要将这个串格式化形如:2017-07-18 09:25:49. 1.首 ...
- 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 ...
- redis书籍
redis中文官网命令网址:http://doc.redisfans.com/ redis英文官网命令网址:https://redis.io/commands redis书籍 由 Karl Segui ...
- zoj 1028 Flip and Shift(数学)
Flip and Shift Time Limit: 2 Seconds Memory Limit: 65536 KB This puzzle consists of a random se ...
- 拦截导弹 (最长上升子序列LIS)
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; ] ...
- freemarker自定义标签(与java合用)
自定义类继承FreemarkerManager类,重写protected Configuration createConfiguration(ServletContext servletContext ...
- 用Direct2D和DWM来做简单的动画效果2
原文:用Direct2D和DWM来做简单的动画效果2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detai ...
- SQL优化系列(一)- 优化SQL
优化SQL SQL开发人员从源代码中发现一条跑得很慢的SQL, 如何优化? DBA从AWR报告中发现一条跑得很慢的SQL,没有源代码或者不想修改源代码怎么办? SQL自动优化工具SQL Tuning ...