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 ...
随机推荐
- 通过实例学习 PyTorch
通过范例学习 PyTorch 本博文通过几个独立的例子介绍了 PyTorch 的基础概念. 其核心,PyTorch 提供了两个主要的特征: 一个 n-维张量(n-dimensional Tensor) ...
- 【Tomcat 源码系列】认识 Tomcat
一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...
- 【Oracle】迁移表到其他的表空间
有些时候需要将表迁移到其他的表空间,在将表空间做相关的操作 下面是命令如何迁移表空间 SQL> alter table 表名 move tablespace 表空间名; 如果有很多的表想要迁移的 ...
- P1341 无序字母对(欧拉回路)
题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一 ...
- EXPORT和IMPORT使用示例
1 report ztestprog. 2 data:begin of itab1 occurs 0, 3 ff(10), 4 end of itab1. 5 data:itab2 like itab ...
- Spring Bean详解
Spring Bean 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的配置 Spring可以看作一个大型工厂,用于生产和管理 ...
- JS编写的科学计算器
最近半个月编写了一个JS+CSS+HTML的网页计算器,从最初的具有简陋界面的简单计算器改版到最终具有科学/标准计算器转换功能并且界面非常友好的计算器,收获良多!总的来说,代码简单,通俗易读,下面贴上 ...
- BeetleX大数据之产品分析服务
数据规模过于庞大?数据标签过多难以管理?增加新的分析维度需要配置?这些beetlex.io都能轻松解决,即导即用,数据标签自动管理,轻易实现多种维度数据分析处理.接下介绍BeetleX针对产品 ...
- Kafka分区分配策略(Partition Assignment Strategy)
众所周知,Apache Kafka是基于生产者和消费者模型作为开源的分布式发布订阅消息系统(当然,目前Kafka定位于an open-source distributed event streamin ...
- Netty编解码器(理论部分)
背景知识 在了解Netty编解码之前,先回顾一下JAVA的编解码: 编码(Encode):在java中称之为序列化,把内存中易丢失的数据结构或对象状态转换成另一种可存储(存储到磁盘),可在网络间传输的 ...