首页 > 其他分享 >单调栈与单调队列复习笔记

单调栈与单调队列复习笔记

时间:2022-10-12 13:00:07浏览次数:66  
标签:复习 leq 队列 cin long int 单调 sta

简介

有时候,我们让 栈/队列 中的所有元素满足单调,然后处理会比较方便。

P2947 [USACO09MAR]Look Up S

给出一个长度为 \(N\) 的序列 \(A\),求出一个序列 \(P\),使得 \(P_i\) 为最大的 \(j\),使得 \(j<i\) 且 \(A_j>A_i\)(若不存在,则 \(P_i=0\))。输出 \(P\)。\(1 \leq N \leq 10^6\)。

首先显然存在 \(O(N^2)\) 暴力,可以拿到 \(92\) 分。然后考虑优化:

维护一个单调递增栈 \(S\),存储位置,将不满足递增性质(即,\(\forall i,j(i<j) A_{S_i} <A_{S_j}\) )的多余元素出栈,然后不难发现,栈顶就是答案。注意,如果是栈为空,那么答案是 \(0\)。

时间复杂度 \(O(N)\)。

参考代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

stack<int> sta;
int n,h[1000005];
int ret[1000005];

signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i];
	}
	for(int i=n;i;i--){
		while(!sta.empty()&&h[sta.top()]<=h[i]){
			sta.pop();
		}
		ret[i]=((sta.empty())?0:sta.top());
		sta.push(i);
	}
	for(int i=1;i<=n;i++){
		cout<<ret[i]<<'\n';
	}
	return 0;
}

P2866 [USACO06NOV]Bad Hair Day S

给出一个长度为 \(N\) 的序列 \(h\),你需要求出一个序列 \(C\) 使得 \(C_i\) 为所有满足 \(j<i\) 且 \(h_j>h_i\) 的 \(j\) 的个数。求 \(\sum\limits_{i=1}^{n}{C_i}\)。\(1 \leq N \leq 80000\)。

感觉这两道题的唯一区别就是一个求最近的,一个求总数。不难发现,\(C_i\) 就是求当前单调栈的大小。

时间复杂度 \(O(N)\)。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

stack<int> sta;
int n,h[1000005];
int ret;

signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i];
	}
	for(int i=1;i<=n;i++){
		while(!sta.empty() && h[sta.top()]<=h[i]){
			sta.pop();
		}
		if(!sta.empty())ret+=sta.size();
		sta.push(i);
	}
	cout<<ret;
	return 0;
}

P3467 [POI2008]PLA-Postering

标签:复习,leq,队列,cin,long,int,单调,sta
From: https://www.cnblogs.com/zheyuanxie/p/monotonous-data-structures.html

相关文章

  • 它让你1小时精通RabbitMQ消息队列(新增死信处理)
    支持.NET/.NETFramework/.NETCoreRabbitMQ作为一款主流的消息队列工具早已广受欢迎。相比于其它的MQ工具,RabbitMQ支持的语言更多、功能更完善。本文提供一种市面上最/......
  • 可靠的延迟队列
    已到时间的消息转移到ready err:=q.pending2Ready() iferr!=nil{ returnerr } //循环调用ready2Unack拉取消息进行消费 ids:=make([]string,0,q.fe......
  • 阻塞队列详解
    什么是阻塞队列【1】阻塞队列:从定义上来说是队列的一种,那么肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,它支持两个附加操作,即阻塞添加和阻塞删除方法。......
  • 程序、进程、线程、多线程是什么,为什么要用多线程?Java基础复习--数组数据结构分析 ins
    大家可分享关于Java微服务相关知识,包括但不限于Java微服务开发经验、架构组成、技术交流、中间件等内容,我们鼓励springcloud架构为基础发散出击,从而达到技术积累的目的,快来......
  • 阿里云openservices rocketmq消息队列消费消息底层源码分析
    mq消费源码依赖<dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</artifactId></dependency>阿里云rocke......
  • 阻塞队列&线程池
    前言阻塞队列是线程池的基础。两者都是面试热点,尤其是线程池。所以我特地花时间学习了一下这方面的知识,并做记录。一.阻塞队列这个其实用的非常多。安卓里面​​Handler​......
  • 通关数据结构 day_05 -- 单调队列
    单调队列经典应用:滑动窗口里的最大值/最小值举例假设有序列:13-1-35367第一次滑动窗口是 【1 3 -1】最小值是-1第二次滑动窗口是 【3 -1 -3】最小值是-3以......
  • Java实现队列
    队列是典型的FIFO数据结构。入队(队尾添加),出队(队首删除)。定义队列接口publicinterfaceQueue<T>{booleanenQueue(Tt);TdeQueue();intsize();}......
  • 遥感期末复习
    title:遥感期末复习excerpt:考完试就删~tags:[遥感,期末]categories:[life,杂谈]index_img:https://picture-store-repository.oss-cn-hangzhou.aliyuncs.com......
  • 吴恩达机器学习复习4:非线性假设、神经和大脑、模型表示1、模型表示2、例子与直觉1、例
    【非线性假设】为什么我们需要神经网络?   因为神经网络不需要大量的为特征设计的内容或有大量特征,,我们可以直接把数据放进进神经网络模型,让它自己进行训练,并做自我......