单调栈解决向右取第一个最高位(洛谷2947)

一,先定义出存储数据的临时栈stk,来存储对应位的数值和位置;以及用来排序的单调栈,顾名思义单调栈内数据大小单调递增,栈底元素是最大的。还有输出栈,用来存储输出的ID;

二,(核心思路)关于单调栈,先依次从临时栈中依次往单调栈填入数据,若填入的数据比前一位小,保留数据和ID(位置),若比前一位大,则压碎(删除)前一位的数据,直到前一位数据比本身要大,并且前面被压碎的数据对应的输出位置是该较大数据的ID,重复此步骤,直到单调栈无新数据加入,留在单调栈中的数据所输出ID便为0;

三,关于定义,利用结构体来对栈的数据和ID进行储存;

四,值得注意的是,在while中赋值的时候,先把out数组填入答案,再top--,直接快速删除单调栈前一位较小值,并且out的索引是单调栈的对应位的id,等于的是该循环中i的值,既第几位;

以下是ac代码

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
	int val;
	int id;
 } stack;
stack str[100005];
stack tem;
int h[100005];
int out[100005];
int top=-1;
void push(stack tem)
{
	str[++top]=tem;
}
void pop()
{
	str[top--];
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d",&h[i]);
	}
	for(int i = 1; i <= n; ++i)
	{
		tem.val=h[i],tem.id=i;
		while(top>=0&&str[top].val<tem.val)
		{
			out[str[top].id]=i;
			pop();
		}
		push(tem);
	}
	for(int i = 1; i <= n; ++i)
	{
	printf("%d\n",out[i]);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值