首页 > 其他分享 >【模板】单调栈

【模板】单调栈

时间:2024-08-21 20:38:30浏览次数:10  
标签:集训队 那么 int 能力 选手 模板 单调

洛谷 P5788 【模板】单调栈

单调栈就是使栈内元素单调递增或者单调递减的栈,单调栈也只能在栈顶操作。 做一个比喻,比方说:有个集训队招人,一个数代表了一个选手的能力值,先进来的选手年龄会比较大,后面的选手年龄比较小,但是这个集训队没有人数限制,那么如果遇到一个比你小还比你强的人那么准备退役吧。 比如有 5 个能力值分别是: 1 7 5 6 3 首先是 1 也就是 选手1 ,那么集训队没有人和他比较所以进入集训队。 单调栈的情况:1

然后是 7 也就是 选手2 ,那么我们可以发现,选手2 比 选手1 要小,并且 选手 2 的能力比 选手1 要强,那么 选手1 留着也没啥用,删掉。 单调栈的情况:7

然后是 5 选手3 ,选手3 比 选手2 年龄要小,但是 选手3 的能力没有 选手2 强,那么 选手3 招进集训队。 单调栈的情况:7 5

那么接下来是 6 选手4 ,选手4 比 选手3 年龄要小,比他还要强, 选手3 淘汰!往后比较,发现 选手2 虽然比 选手4 要大,但是他能力很强!所以不会被淘汰,将 选手4 招进集训队。 单调栈的情况:7 6

最后是 3 选手5 ,选手5 比 选手4 要小,但是 选手4 的能力比 选手5 要强,所以 选手4 必定也比不过 选手2 ,但由于 选手5 小所以不淘汰他。 单调栈的情况:7 6 3

刚刚解析完了单调栈,那么,现在开始分析一下这道题目吧! 这道题目就是说往右边看,找出第一个(能力)大于你的数(选手)。 不妨把它反过来,从最后一个开始入单调栈。 如果说没有比它小的那么就是输出 0 。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int >P;
stack<P>s;
int n,ans[3000010],a[3000010];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		while(!s.empty()&&s.top().first<a[i]){
			ans[s.top().second]=i;
			s.pop();
		}
		s.push({a[i],i});
	}
	for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
	
}

标签:集训队,那么,int,能力,选手,模板,单调
From: https://www.cnblogs.com/mengxiaolong/p/18372469

相关文章

  • C++智能指针配合STL模板类
    代码 #include<unordered_map>#include<set>#include<memory>classResID{public:usingSP=std::shared_ptr<ResID>;ResID()=default;ResID(conststd::string&id,conststd::string&type):m_id(id......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • Element Plus表单调用resetFields方法失效
    问题描述:你会发现在第一次点击新增按钮的时候然后再点击编辑按钮,再点击新增按钮表单是可以正常清空的。但是如果你第一次点击编辑按钮,表单数据回显,关闭窗口再点击新增按钮发现编辑的数据竟然还在,就很玄乎。而且,你点击编辑其他数据再点击新增按钮发现竟然是第一次点击编辑的数据!......
  • C++类模板案例-数组类封装
    #include<iostream>usingnamespacestd;template<classT>classMyArray{public: MyArray(intcapacity) { this->m_Capacity=capacity; this->m_Size=0; this->pAddress=newT[this->m_Capacity]; } ~MyArray() { if(th......
  • 【Vue】模板语法
    系列文章目录第三章模板语法文章目录系列文章目录前言一、文本:二、显示原生的HTML三、属性绑定四、使用JavaScript表达式:五、条件判断:六、v-show和v-if:七、循环1.循环数组2.循环对象3.保持状态4.触发视图更新5.覆盖数组八、事件绑定1.基本使用2.传入event参......
  • [YM]模板-堆
    概念:堆是一种树形结构,堆顶始终是最优值(最大或最小)。堆一般是用二叉树实现的,称为二叉堆。二叉堆是一种完全二叉树堆由对顶可以分为大根堆和小根堆 ————————————————————————————————堆一般用数组去实现:用数组A[]存储完全二叉树,节点数......
  • WPF:数据模板
    WPF:DataTemplate在XAML界面当中编写的任何代码,其实本质上都是转化成C#代码,既然如此来说,只要XAML有的对象,我们都可以用C#代码编写,但是为什么一般我们不这么做,是因为XAML更加容易去表达界面上的元素,代码的可视化以及可维护性。需求:当我想要在ListBox或者DataGridView......
  • leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板
    leetcode322.零钱兑换给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins=[1,2,5......
  • vue切换组件基础模板
    需求:登录注册两个按钮,点击登录的时候登录显示,点击注册的时候注册显示,另外一个隐藏如下图所示先定义两个template组件<templateid="login"><div><h2>用户登录</h2><p>用户名:<inputtype="text"v-model="us......
  • 织梦模板引擎的代码样式有如下几种形式
    1、织梦模板引擎的代码样式有如下几种形式:{dede:标记名称属性='值'/} {dede:标记名称属性='值'}{/dede:标记名称}{dede:标记名称属性='值'}自定义样式模板(InnerText){/dede:标记名称}提示:如果使用带底层模板的标记,必须严格用{dede:标记名称属性='值'}{/ded......