首页 > 其他分享 >郝玩的数据结构1——单调栈,单调队列

郝玩的数据结构1——单调栈,单调队列

时间:2024-11-11 21:46:49浏览次数:1  
标签:int top 元素 队列 tail 数据结构 郝玩 单调

栈和队列是很郝咏的Stl,那么,我们手搓——用数组模拟
故事背景:辣鸡老o在学单调栈&单调队列
——我栈
top为栈顶,易得出出栈即top--,入栈++top=(ovo)......
——完全不会讲,那么上马:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=114514;
int stk[N],top=0;
/*
inline int read(){
	int wow=0,f=1;
	char c=getchar();
	while(c>'9' || c<'0'){
		if(c=='-') f=-f;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		wow=(wow<<3)+(wow<<1)+c-'0';
		c=getchar();
	}
	return f*wow;
}
*/

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int q;//q次操作
	cin>>q;
	for(int i=1;i<=q;i++){
		int x,c;
		cin>>x;
		if(x==1){//入栈 
			cin>>c;
			stk[++top]=c;
		}
		else{//出栈 
			if(top<1){
				cout<<"EMPTY!\n";
			}
			else{
				cout<<stk[top--]<<"\n";
			}
		}
		
	} 
	return 0;
}

——我队列
head为队头,tail为队尾,出队head++,入队++tail=(ovo)......
——上马

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=114514;
int que[N],head=1,tail=0;
//消失的快读 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int x,c;
		cin>>x;
		if(x==1){
			cin>>c;
			que[++tail]=c;
		}
		else{
			if(head==tail+1){
				cout<<"EMPTY!\n";
			}
			else{
				cout<<que[head++]<<"\n";	
			}
		}
	}
	return 0;
}

——我记得我是要学单调栈来着
单调栈,记录依托数组中某个元素之前(后)的第一个大于或小于它的元素,并可以在O(n)的时间内完成(也许解释的很狭义)——
当我在黑暗中积蓄的情绪,期待光明降临时,突然降临的一束光,让我所有的情绪全部爆发了
当我的栈中的所有元素单调减,没有弹出的希望,突然出现一个大于当前序列中部分元素(即可)的数,栈中的小于该元素的元素的ans全部重置为该元素的下标
——压入一个元素(的下标,能快速在原数组中找到对应值的那种啦)时只有两种情况:
1.一刀切若干元素,并当栈顶
2.仅入栈
——很啰嗦,所以上马

点击查看代码
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int wow=0,f=1;
	char c=getchar();
	while(c>'9' || c<'0'){
		if(c=='-'){
			f=-f;
		}
		c=getchar();
	}
	while(c>='0' && c<='9'){
		wow=(wow<<3)+(wow<<1)+c-'0';
		c=getchar();
	}
	return wow*f;
}
const int N=3e6+5;
int n,a[N],ans[N],q[N];

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) a[i]=read();
	int top=0;
	for(int i=1;i<=n;i++){
		while(top>0 && a[q[top]]<a[i]){
			ans[q[top]]=i;
			top--;
		}
		q[++top]=i;
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	
}

芜湖起飞(单调栈)

——那么,单调队列
单调队列是用来解决一个定长区间中的最大值问题的一种可爱的竖锯结垢(此处致敬xxxxx26),其实现思路是向一个手搓plus版——可以从头出队,从头入队,从尾出队的队列中压入元素(话说为什么叫压入)(的下标)
压入元素时,若该元素比原队列中元素更优,那将该元素出队
——如果一个oier比你小,还比你强,你就没有存在的意义了
(stop!!!)
第二种出队方法在下标超过区间范围是自然出队
——上高三了
——仍然很啰嗦,也很容易破防,所以上马

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
const int N=1e6+12;
int a[N];
int que[N];
int head=1,tail=0;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		int j=i;
		while(head<=tail && a[que[tail]]>=a[i]){
			tail--;
		}
		que[++tail]=i;
		if(que[head]<i-k+1) head++;
		if(i>=k) cout<<a[que[head]]<<" ";
	}cout<<"\n";
	head=1,tail=0;
	for(int i=1;i<=n;i++){
		int j=i;
		while(head<=tail && a[que[tail]]<=a[i]){
			tail--;
		}
		que[++tail]=i;
		if(que[head]<i-k+1) head++;
		if(i>=k) cout<<a[que[head]]<<" ";
	}
	return 0;
}
[芜湖起飞(单调队列)](https://www.luogu.com.cn/problem/P1886)

标签:int,top,元素,队列,tail,数据结构,郝玩,单调
From: https://www.cnblogs.com/cathy56/p/18540657

相关文章

  • 力扣 170. 两数之和 III - 数据结构设计 two-sum III
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续序列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • C++ 数据结构详解
    目录C++数据结构详解引言1.数组(Array)示例代码2.向量(Vector)示例代码3.链表(List)示例代码4.栈(Stack)示例代码5.队列(Queue)示例代码6.集合(Set)示例代码7.映射(Map)示例代码C++数据结构详解引言数据结构是计算机科学中的一个重要概念......
  • python中常见的8种数据结构之一字典及其使用方法
    字典(Dictionary)是Python中常见的数据结构之一,用于存储一组配对的键(key)和值(value)。字典是可变的、无序的,并且键必须是唯一的。创建字典的方法有两种:使用花括号{}或使用内置的dict()函数。下面是一些常见的字典操作和方法:1.创建字典:my_dict={'key1':'value1','key2'......
  • 数据结构 ——— 链式二叉树oj题:对称二叉树
    目录题目要求手搓一个对称二叉树代码实现 题目要求给你一个二叉树的根节点 root ,检查它是否轴对称手搓一个对称二叉树代码演示://数据类型typedefintBTDataType;//二叉树节点的结构typedefstructBinaryTreeNode{ BTDataTypedata;//每个节点的数据......
  • 单调栈基础模板
    #include<bits/stdc++.h>usingnamespacestd;constintN=1000005;intn,ansl[N],ansr[N],a[N];intf[N],r,x;intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i],ansl[i]=ansr[i]=-1;for(inti=0;i<n;i++){......
  • ABC372D ABC379F 题解 单调栈二分
    ABC372DABC379F题解单调栈二分一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2简单一些。好多次碰到这个单调栈里面二分的trick了,所以写一篇来总结一下。ABC372D形象地给定一系列Buildings的高度\(h\),保证每个......
  • 数据结构[2016]
    一、设有二维数组A[6][8],每个元素占6个字节存储,实现存放,A[0][0]的起始地址为1000,计算:(10分)(1)数组最后一个元素A[5][7]的起始地址;(2)按行优先存放时,元素A[1][4]的起始地址;(3)按列优先存放时,元素A[4][7]的起始地址。二、若有一棵二叉树,左右子树均有三个结点,其左子树的前......
  • 数据结构大作业-计算机实践课程
    目录源码数据结构报告系统功能框图及说明开发环境系统主要功能运行效果截图创建一条含整数节点的无序链表链表节点的输出链表节点的升序排序分别计算链表中奇数和偶数点之和并输出释放链表源码#include<iostream>#include<string>usingnamespacestd;ty......
  • Python中的数据结构:collections库详解
    Python中的数据结构:collections库详解在日常Python开发中,我们经常需要处理各种数据结构。Python标准库自带的collections模块,为我们提供了一系列高效且灵活的容器数据类型,比基础数据结构(如list,dict,set,tuple)功能更丰富,应用场景更广泛。本文将详解collections......
  • 单调队列笔记
    单调队列笔记双端队列deque维护一个严格单调变化的组,可以称为一个单调队列单调队列因为可以直接对组的两端进行操作,所以可以有效的降低时间复杂度用单调队列来解决问题,一般是需要得到的某个范围内的最小值或最大值这里以一道经典的单调队列的题目为例:题目描述有一个长为\(......