Discrete Centrifugal Jumps CodeForces - 1407D 单调栈+dp
题意:
给你n个数hi,你刚开始在第1个数的位置,你需要跳到第n个数的位置。
1、对于i、j(i<j) 如果满足
max(hi+1,…,hj−1)<min(hi,hj)
max(hi,hj)<min(hi+1,…,hj−1)
那么就可以从i直接一步跳到j位置
2、如果j=i+1,那么也可以直接跳过去
问你从第一个位置跳到第n个位置,最少需要跳多少次
题解:
我们设dp[i]表示:从第一个位置跳到第i个位置最小需要跳多少次
我们最重要的就是找在[1,i-1]这个区间内的k,哪个位置可以跳到i位置以使得dp[i]尽可能小。如果暴力查找的话,那么复杂度就是O(n*n),看一下数据就知道TLE
那我们就要用一种数据结构来使得找这个k,这里我们使用栈,为什么不使用队列,因为如果满足
max(hk+1,…,hi-1)<min(hk,hi)
max(hk,hi)<min(hk+1,…,hi-1)
就可以从k一步跳到i,我们使用单调队列那么就是从头开始了。
我们维护两个单调栈,一个非严格递增,另一个非严格递减
我们在这里讨论非严格单调递增栈的维护过程:
如果一个数vi在放入栈之前,判断得知hi>=h[r.top],那么就可以从r.top位置跳到i位置。
这个时候有一个问题,如果你把栈中的一些元素pop掉了,但是这些元素还可以更新大于i的位置的dp值 这个时候会影响最后的结果吗?
其实是不会影响的,因为如果hk在hi进行栈之前被pop掉了,那么hk肯定是小于hi的。如果hk可以更新hj的信息(i<j) 那么vk和vj中那个大的肯定会小于min(vk+1,vk+2...vj-1)。 那么这个时候我们看我们维护的另一个非严格下降序列,它会替我们考虑这个问题的
所以这样实现起来其实是没有问题的
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=3e5+10;
const int INF=0x3f3f3f3f;
#define mem_(x) memset(x,INF,sizeof(x))
int v[maxn],dp[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&v[i]);
}
mem_(dp);
stack<int>r; //非严格递增
stack<int>r2; //非严格递减
r.push(1);
r2.push(1);
dp[1]=0;
for(int i=2;i<=n;++i)
{
int flag1=0,flag2=0;
while(r.size() && v[i]>=v[r.top()])
{
//printf("%d %d\n",i,r.top());
if(v[i]==v[r.top()]) flag1=1; //如果栈里面有数字和vi相等,那么我们在下面的判断中就不能使用r.top
dp[i]=min(dp[i],dp[r.top()]+1); //进行更新vi的值,因为题目要求vi和vj之间的数要小于两者中的最小值
r.pop();
//flag1=1;
}
if(r.size() && !flag1)
{
dp[i]=min(dp[i],dp[r.top()]+1);
}
r.push(i); while(r2.size() && v[i]<=v[r2.top()])
{
if(v[i]==v[r2.top()]) flag2=1;
dp[i]=min(dp[i],dp[r2.top()]+1);
r2.pop();
//flag2=1;
}
if(r2.size() && !flag2)
{
dp[i]=min(dp[i],dp[r2.top()]+1);
}
r2.push(i);
}
printf("%d\n",dp[n]);
return 0;
}
Discrete Centrifugal Jumps CodeForces - 1407D 单调栈+dp的更多相关文章
- 洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)
正解:单调栈/dp 解题报告: 先放个传送门qwq 话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq (umm主要如果dp做好像是要斜率优化凸壳维护双 ...
- Codeforces 1383E - Strange Operation(线段树优化 DP or 单调栈+DP)
Codeforces 题目传送门 & 洛谷题目传送门 Yet another 自己搞出来的难度 \(\ge 2800\) 的题 介绍一个奇奇怪怪的 \(n\log n\) 的做法.首先特判掉字 ...
- CodeForces 548D 单调栈
Mike and Feet Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Subm ...
- CF1407D Discrete Centrifugal Jumps 题解
蒟蒻语 写了 \(100\) 行的 线段树上ST表维护二分维护单调栈维护dp, 结果最后发现只要俩单调栈就好了 = = 蒟蒻解 首先 \(dp_i\) 表示从 \(1\) 楼到 \(i\) 楼要跳几次 ...
- BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个 ...
- bzoj4709 柠檬 单调栈,DP,斜率优化
目录 前言吐槽 思路 错误 代码 /* 前言吐槽 我真的不知道是咋做的 不过大约就是栈的斜率优化 哪位大佬见识广,给看看吧(乞讨) 思路 s是值等于a[i]的前缀和 转移方程$f[i]=max(f[i ...
- Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)
https://codeforces.com/contest/1131/problem/G 题意 给你一排m个的骨牌(m<=1e7),每块之间相距1,每块高h[i],推倒代价c[i],假如\(a ...
- POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15831 ...
- HDU1506(单调栈或者DP) 分类: 数据结构 2015-07-07 23:23 2人阅读 评论(0) 收藏
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
随机推荐
- linux常用命令--转载
转载自: https://www.cnblogs.com/Qsunshine/p/10402179.html 常用指令 ls 显示文件或目录 -l列出文件详细信息l(list) -a列出当前目录下所有 ...
- 为linux添加一块新硬盘并分区
一---如何增加一块硬盘1:虚拟机添加硬盘2:分区3:格式化4:挂载5:设置可以自动挂载 1---设置里面 2---分区命令 fdisk /dev/sdb开始分区m显示命令列表p显示磁盘分区 同fdi ...
- Centos7 Nginx+PHP7 配置
Centos7 Nginx+PHP7 配置 内容: 源码编译安装Nginx和PHP 配置PHP和Nginx,实现Nginx转发到PHP处理 测试 设置Nginx.PHP开机自启 安装的版本: Ngin ...
- 怎么判断innodb 日志缓冲区该设置为多大呢
怎么判断innodb 日志缓冲区该设置为多大呢
- 【Python】用字母生成图像
用字母生成图像会用到matplotlib.pyplot库 所以需要安装这个库 pip install matplotlib 等待安装完成即可 ps:由于网络原因,会出现多次的timeout,可以使用国 ...
- Kubernetes CoreDNS 状态是 CrashLoopBackOff 报错
查看状态的时候,遇见coredns出现crashlookbackoff,首先我们来进行排错,不管是什么原因,查看coredns的详细信息,以及logs [root@k8s-master coredns ...
- kafka(一)入门
一.消息引擎系统 这类系统引以为豪的消息传递属性,像引擎一样,具备某种能量转换传输的能力 消息引擎系统是一组规范,企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递.通俗地讲 ...
- 1.5V升3V芯片和电路图,DC-DC升压IC
1.5V升3V的升压芯片,3V给LED供电,或者单片机模块供电等. PW5200A工作频率为1.4MHZ.轻载时自动PWM/PFM模式切换,提高效率. PW5200A能够提供2.5V和5V之间的可调输 ...
- Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...
- Flask源码关于local的实现
flask源码关于local的实现 try: # 协程 from greenlet import getcurrent as get_ident except ImportError: try: fr ...