首页 > 编程语言 >单调栈算法

单调栈算法

时间:2023-08-07 22:13:32浏览次数:46  
标签:ch 定义 int while 算法 单调

单调栈算法

单调栈,就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。

// 单调栈算法
#include<bits/stdc++.h>
#define reg register
using namespace std;

// 读取输入,并返回一个整数
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1; // 如果字符是负号,设置标志位为负
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48); // 将字符转换为数字并加到结果中
		ch=getchar();
	}
	return x*f; // 返回结果
}

// 输出结果,将整数转换为字符串并打印出来
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x; // 如果是负数,先打印负号再取反
	}
	if(x>9) write(x/10); // 如果数字大于9,递归调用函数处理十位数
	putchar(x%10+'0'); // 打印个位数
	return ;
}

const int MAXN=3000006; // 常量定义最大值
int n,ans[MAXN]; // 定义变量n和结果数组ans
vector<int > a; // 定义向量a存储输入数据
stack<int > s; // 定义栈s用于单调性判断

int main(){
	n=read(); // 从输入中读取数据的数量n
	a.push_back(0); // 在向量a的末尾添加一个元素0作为哨兵
	for(reg int i=1;i<=n;i++) a.push_back(read()); // 从输入中读取n个数据,并添加到向量a中
	for(reg int i=n;i>=1;i--){ // 从后向前遍历向量a中的元素
		while(!s.empty()&&a[s.top()]<=a[i]) s.pop(); // 如果栈不为空且栈顶元素小于等于当前元素,则弹出栈顶元素直到满足条件
		ans[i]=s.empty()?0:s.top(); // 如果栈为空,则结果为0,否则结果为栈顶元素,并将其压入栈中
		s.push(i); // 将当前元素压入栈中
	}
	for(reg int i=1;i<=n;i++){ // 从后向前遍历向量a中的元素,并打印结果
		write(ans[i]); // 将结果转换为字符串并打印出来
		putchar(' '); // 在每个结果后面添加一个空格以便区分不同的结果
	}
	return 0; // 程序正常结束,返回0
}

标签:ch,定义,int,while,算法,单调
From: https://www.cnblogs.com/Nebulary/p/17612858.html

相关文章

  • 递推算法例题C++
    1、移动路线【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明......
  • ST算法
    没有修改的区间最值\(O(nlogn)\)预处理\(O(1)\)查询\(f[i][j]\):从\(i\)开始长度\(2^j\)的范围内的最大值预处理是前后两部分合并结果查询的时候从前往后长度\(T\)和从后向前长度\(T\)的两段区间并\(T\)是接近\(r-l+1\)最大的二进制数voidst_pre(){ f......
  • 算法练习-day40
    动态规划309.买卖股票的最佳时机含冷冻期题意:给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。注......
  • 算法练习-day39
    动态规划123.买卖股票的最佳时机III题意:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。实例:思路:由题意可知,我们最多......
  • 文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题
    三、请简要地证明:在规模为n的子数组上,PARTITION的时间复杂度为Θ(n)。文心一言:首先,我们需要明确PARTITION函数的具体定义。PARTITION函数通常用于快速排序算法中,它将一个数组分为两个子数组,使得一个子数组的所有元素都小于另一个子数组的所有元素。PARTITION函数的基本过程是:1......
  • 算法练习-day38
    动态规划121.买卖股票的最佳时机题意:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中......
  • Redis精通系列——LFU算法详述(Least Frequently Used - 最不经常使用)
    转:Redis精通系列——LFU算法详述(LeastFrequentlyUsed-最不经常使用)  ......
  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号    卡哥建议:讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%8......
  • 在开源项目中看到一个改良版的雪花算法,现在它是你的了。
    你好呀,我是歪歪。在Seata的官网上看到一篇叫做“关于新版雪花算法的答疑”的文章。http://seata.io/zh-cn/blog/seata-snowflake-explain.html看明白之后,我觉得还是有点意思的,结合自己的理解和代码,加上画几张图,给你拆解一下Seata里面的“改良版雪花算法”。虽然是在Se......
  • Java调度算法实现与应用(FCFS、SJF、RR、HPF)
    文章目录一、调度算法概述二、先来先服务(FCFS)算法1、概述2、Java实现FCFS3、优缺点三、短作业优先(SJF)算法1、概述2、Java实现SJF3、优缺点四、时间片轮转(RR)算法1、概述2、Java实现RR3、优缺点五、优先级调度(HPF)算法1、概述2、Java实现HPF一、调度算法概述调度算法常见于操作系统......