P5019 铺设道路 (NOIP2018)
NOIP2013原题
貌似官方数据都是一模一样的
以前写过竟然毫无印象?
考场上自己瞎JB推结论
显然,如果连续的两端区间可以左边区间减 k 次,右边区间也减 k 次
那么把两个区间合并起来一起减 k 次一定是更优的
所以先考虑把整个区间拿来减几次,显然最多减的次数就是整个区间的最小值
然后此时最小值已经为零了,以最小值的位置分成左右两个区间继续同样处理就好了
如果每个区间都扫一遍最小值复杂度可以卡成 $O(n^2)$,(单调序列)
所以区间最小值容易想到ST表
然后复杂度 $O(nlog_n)$ (预处理ST表的复杂度)
话说官方数据 $O(n^2)$ 也能过....
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
int n,a[N],pos[N][],Log[N];
ll ans;
void pre()//预处理ST表
{
Log[]=-; for(int i=;i<=n;i++) Log[i]=Log[i>>]+;
for(int i=;i<=n;i++) pos[i][]=i;
for(int i=;(<<i)<=n;i++)
for(int j=;j+(<<(i-))<=n;j++)
{
if(a[ pos[j][i-] ]>a[ pos[j+(<<(i-))][i-] ]) pos[j][i]=pos[j+(<<(i-))][i-];
else pos[j][i]=pos[j][i-];
}
}
inline int query(int l,int r)//区间求最小值
{
int k=Log[r-l+];
if(a[ pos[l][k] ]>a[ pos[r-(<<k)+][k] ]) return pos[r-(<<k)+][k];
return pos[l][k];
}
void f(int l,int r,int tot)//递归处理左右区间,tot是当前已经进行的操作次数
{
if(l>r) return;
int t=query(l,r);
ans+=a[t]-tot;
f(l,t-,a[t]); f(t+,r,a[t]);
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[i]=read();
pre();
f(,n,);
cout<<ans<<endl;
return ;
}
P5019 铺设道路 (NOIP2018)的更多相关文章
- 洛谷 P5019 铺设道路 & [NOIP2018提高组](贪心)
题目链接 https://www.luogu.org/problem/P5019 解题思路 一道典型的贪心题. 假设从左往右填坑,如果第i个深与第i+1个,那么第i+1个就不需要额外填: 如果第i+1 ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- NOIP2018&2013提高组T1暨洛谷P5019 铺设道路
题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...
- 洛谷P5019 铺设道路 题解 模拟/贪心基础题
题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...
- 洛谷 P5019 铺设道路(差分)
嗯... 题目链接:https://www.luogu.org/problem/P5019 首先简化一下题意: 给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全 ...
- P5019 铺设道路
#include<bits/stdc++.h> using namespace std; ]; ; int main() { cin>>n; ;i<=n;i++) cin ...
- NOIP2018D1T1 铺设道路
原题:NOIP2013D1T1 积木大赛 题目地址:P5019 铺设道路 思路:玄学瞎搞 将每块区域插入一个小根堆,这里的小根堆用优先队列实现,即运用一个 \(pair\) , \(first\) 为 ...
- 题解【洛谷P5019】[NOIP2018]铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 洛谷P5019 [NOIP2018 提高组] 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...
随机推荐
- JavaScript的流程控制语句
JS的核心ECMAScript规定的流程控制语句和其他的程序设计语言还是蛮相似的.我们选择一些实用的例子来看一下这些语句.顺序结构我们在这里就不再提到,直接说条件和循环以及其他语句.一.条件选择结构 ...
- WCF客户端调用并行最大同时只支持两个请求
做项目的时候发现 频繁调用WCF服务时 明明一次性发起了几十个请求 而在服务端记录的日志却显示出现了排队的迹象 并且都是最大并发数为2 在网上狂搜 大家给出来的解决方法都是增加web.config里面 ...
- 一篇docker的详细技术文章
http://www.open-open.com/lib/view/open1423703640748.html
- vs调试时不抛出异常的解决方案
选项->调试->常规->启用“仅我的代码” 打勾
- c++ 切勿重新定义继承来的带缺省参数的函数
切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...
- 数据结构 i_love(我喜欢)
数据结构 i_love(我喜欢) 问题描述 集训队的学长们都怪怪的,如果 A 学长喜欢 B 学长, A 就会把自己的名字改成«I_love_<B 学长的名字>».但是奇怪的学长们很容易移情 ...
- Bootstrap 组件之 Panel
一.简介 Panel 指面板.这里 有例子. 一个典型的面板的代码结构是这样的: .panel.panel-default .panel-heading .panel-title Title Text ...
- C++笔记--函数
函数的定义和声明 函数的声明和定义都必须描述相同的类型,但是声明可以不写参数名,定义则必须写参数名,但是他们的参数名字可以不同. 一个局部变量被声明为static,那么这个局部变量将只会被初始化一次, ...
- 多线程学习-基础(六)分析wait()-notify()-notifyAll()
一.理解wait()-notify()-notifyAll()obj.wait()与obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,notify是针对已经获 ...
- shape不同版本这间的兼容
在做那个只有左边上面是圆角和只有右边下边是圆角的时候,出现了一个问题,那就是在android3.0以前,android:bottomLeftRadius与android:bottomRightRadi ...