首页 > 其他分享 >数据结构1.1

数据结构1.1

时间:2023-03-02 22:46:54浏览次数:58  
标签:输出 1.1 int 样例 tt 栈顶 数据结构 单调

一、简述

本节介绍一下单调栈以及单调栈的一些应用。

二、单调栈

所谓单调栈,就是具有存储的元素呈现某种单调性的栈。

比如:从栈底元素到栈顶元素是单调递减的,就是一个单调递减栈。

下面我们引入几道题目来更好的理解一下。

三、例题

1.[AcWing830.单调栈]

题目描述

给定一个长度为 \(N\) 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 \(−1\)。

输入格式

第一行包含整数 \(N\),表示数列长度。

第二行包含 \(N\) 个整数,表示整数数列。

输出格式

共一行,包含 \(N\) 个整数,其中第 \(i\) 个数表示第 \(i\) 个数的左边第一个比它小的数,如果不存在则输出 \(−1\)。

数据范围

\(1≤N≤10^5\)

\(1≤\) 数列中元素 \(≤10^9\)

输入样例
5
3 4 2 7 5
输出样例
-1 3 -1 2 2
解题思路

既然是介绍单调栈,那么我们肯定是使用单调栈来解决。具体思路:我们要输出每个数左边第一个小于它自己的数,我们构造一个单调单调递增的栈,首先我们从左往右遍历序列,当栈不空的时候,我们比较栈顶元素和当前数 \(a_i\) 的大小,如果栈顶元素大于等于 \(a_i\),我们就弹出栈顶,直至栈为空或者不再满足为止,如果栈为空,说明 \(i\) 之前没有元素小于 \(a_i\),就输出 \(-1\),如果栈中还有元素,那当前的栈顶就是 \(i\) 左边第一个小于 \(a_i\) 的数。然后我们将 \(a_i\) 加到栈顶。

C++代码
#include <iostream>
using namespace std;
const int N = 100010;

int n, tt;
int stk[N];

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i ++)
    {
        int x;
        scanf("%d", &x);
        while(stk[tt] >= x && tt) tt --;
        if(tt == 0)
            printf("-1 ");
        else
            printf("%d ", stk[tt]);
        stk[++ tt] = x;
    }
    return 0;
}

2.[Daimayuan Online Judge.最大矩形面积]

题目描述

有一张 \(n\) 列的网格图,每列有一些格子被小蜗从底向上涂了色。现在给你每一列被涂色的格子的高度 \(a_i\),请你求出被涂色的格子组成的最大矩形的面积。

输入格式

第一行一个整数 \(n\),表示总列数。

接下来一行 \(n\) 个数 \(a_1,a_2,...,a_n\)。

输出格式

输出一行一个数,表示最大面积。

数据范围

对于 \(100\%\) 的数据,保证 \(1≤n≤2×10^5,1≤a_i≤10^9\)。

输入样例
5
1 2 5 3 4
输出样例
9
解题思路

具体思路:我们对于每一个 \(a_i\),往其左边和右边找到小于 \(a_i\) 的第一个数所在的位置,分别是 \(l_i\) 和 \(r_i\)。那么对于这之间的矩形面积为 \((r_i - l_i - 1)*{a_i}\)。然后我们对于所有的矩形面积求最大值即可。

image

比如样例:对于 \(a_1,...,a_5\),分别形成的矩形面积为 \(5、8、5、9、4\),在枚举的时候我们可以看到其正确性:首先是尽可能往两边延伸,且可以覆盖在 \(a_i\) 情况下的最大面积。

C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;

int n, a[N], stk[N], tt = 0;
int l[N], r[N];

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) 
		scanf("%d", &a[i]);
	for (int i = 1; i <= n; i ++)
	{
		while (tt && a[i] <= a[stk[tt]])
			tt --;
		if (tt)
			l[i] = stk[tt];
		else 
			l[i] = 0;
		stk[++ tt] = i;
	}
	tt = 0;
	for (int i = n; i >= 1; i --)
	{
		while (tt && a[i] <= a[stk[tt]])
			tt --;
		if (tt)
			r[i] = stk[tt];
		else 
			r[i] = n + 1;
		stk[++ tt] = i;
	} 
	long long ans = 0;
	for (int i = 1; i <= n; i ++)
		ans = max(ans, 1ll * abs(r[i] - l[i] - 1) * a[i]);
	cout << ans;
	return 0;
}

标签:输出,1.1,int,样例,tt,栈顶,数据结构,单调
From: https://www.cnblogs.com/Cocoicobird/p/17173852.html

相关文章

  • 11.1/2 鼠标显示问题(harib08a)11.2 实现画面外的支持(harib08b)
    11.1鼠标显示问题(harib08a)存在问题:​ 在harib07d中鼠标移动到最右侧后就不能再往右移了解决办法:将if(mx>binfo->scrnx-16){mx=binfo->scrnx-16;}if(......
  • 3月1日至3月2日——数据结构与算法分析阅读笔记,线性表,AI。
    (开头是一些废话啊,最近感觉学习状态不太好,上高数的时候左耳听进去右耳就出来了,有点跟不上,可能是没吃饭的原因,也可能是最近强度有点大了,下午上完课就给自己休息了一下,结果刷......
  • 数据结构与算法之美
    复杂度分析为什么需要时间复杂度?通过统计、监控获得代码的运行时长和占用内存有一定的局限性。测试结果非常依赖测试环境。如在不同的处理器下获得的运行结果不同。......
  • 【ZooKeeper基础-数据结构、服务端/客户端常用命令】
    一、ZooKeeper简介二、ZooKeeper数据结构&命令**1、数据结构**2、服务端常用命令①单机启动命令:./zkServer.shstart②状态查询命令:./zkServer.shstatus③停止服务......
  • 数据结构之单向不循环链表
    链表是一种物理存储结构上非连续、非顺序的线性存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表中的元素(节点)中记录了与其他元素的连接关系,链表的存储方......
  • 【基本数据结构】栈
    一、后进先出(LIFO)栈是一种操作受限的线性表,只允许在一端插入和删除数据,这一端叫做栈顶,对应的另一端叫做栈底。向栈中添加元素也叫进栈、入栈、压栈,从栈中删除元素也叫出......
  • 数据结构与算法-其它
    二叉树、B树、B+树、红黑树B树B树与二叉树的区别1、B树与二叉树的区别二叉树最多能有2个子节点,B树最多有M个子节点,最少有3个子节点。2、B树和B+树的比较:1)B树的关键字......
  • (转)数据结构和算法(Golang实现)(8.2)基础知识-分治法和递归
    原文:https://juejin.cn/post/6844904132378263565分治法和递归在计算机科学中,分治法是一种很重要的算法。字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多......
  • tree数据结构处理
    importReactfrom'react';interfaceRootObject{createUserId?:any;createUserName?:any;createTime?:any;updateUserId?:any;updateUserName?:a......
  • Redis 五种数据结构以及三种高级数据结构解析
    Redis五种数据结构以及三种高级数据结构解析硬核资源!Redis五种数据结构以及三种高级数据结构解析(详解)(baidu.com) Redis五种数据结构以及三种高级数据结构解析(38......