基本数据结构

news/2024/12/23 14:47:25/文章来源:https://www.cnblogs.com/EmilyDavid/p/18624000

线性的基本数据结构

先进后出,没啥好讲的,主要是应用。

关于表达式

栈可以做表达式相关的问题。

几个名词:

逆波兰式是后缀表达式,波兰式是前缀表达式。

后缀表达式求值

可以用栈做到\(O(n)\)

  1. 建立一个栈,储存表达式中的数字。

2.从前往后扫后缀表达式。遇到数字就入栈,遇到运算符就从栈中取出数字做运算,运算结果再入栈。注意减这种有顺序的运算

  1. 最后栈中还剩一个数,即答案。

中缀表达式求值

Sol_1

先把中缀表达式转成后缀表达式,再求值,\(O(n)\)

  1. 建立一个栈,储存表达式中的运算符。

  2. 从前往后扫表达式,开始大力分讨:若是数字,输出;若是(,入栈;若是),不断输出栈顶直到栈顶为(,再将(出栈但不用输出;若是运算符\(op\),不断取出栈顶直到\(op\)的优先级大于栈顶,再将\(op\)入栈(优先级:*/>+->()。

  3. 最后依次取出栈中剩余元素并输出。

转换之后再对后缀表达式求值即可。

Sol_2

可以递归,\(O(n^2)\)

考虑求出中缀表达式中\([l,r]\)的值,我们要求的就是\([1,n]\)

  1. 考虑没有被任何括号包含的运算符,先考虑加减,再考虑乘除:若存在加减号,选择最靠右的一个,分左右两边递归;若存在乘除号,选最靠右的一个,分左右两边递归。

  2. 若不存在没有被任何括号包含的运算符:若首尾都是括号,则返回\([l+1,r-1]\)的答案;否则这个区间是一个数字,返回其数值。

表达式树

更强大的处理表达式的东西,通过栈建出来。

  1. 建立一个栈,储存表达式树的节点编号。

  2. 从前往后扫后缀表达式:若是数字,新建一个节点,以当前数字为值,左右儿子为空,入栈;若是运算符,新建一个节点,以当前运算符为值,先从栈中取\(r\),再从栈中取\(l\),合并起来再入栈,注意左右儿子取出的顺序!

表达式树一定是一棵二叉树。其前序遍历为前缀表达式,中序遍历为中缀表达式,后序遍历为后缀表达式。

建好后就可以DFS查询了,注意根据题意剪枝。

对顶栈

典:维护一段文本以及光标,支持光标处插入删除,光标处查询,前后移动光标。

Sol

光标前后维护两个栈即可。

单调栈

就是保证栈内的元素具有单调性,是类似单调队列的东西。

二维的查询就尝试压缩到一维上,将信息拍平。

栈的神秘操作

\(Question\)

维护一个栈,支持插入删除,查最大次大。

Sol

入栈出栈可以看成建树的过程。入栈就是跳到儿子,出栈就是跳到父亲。查最大次大就是查树上前缀最大次大。于是可以维护了。

也可以把最大值单独维护一下,其他的元素塞到set里面。

栈的终极Trick:baka's trick

首先思考双栈模拟双端队列。

Sol:

维护两个栈,使得两个栈拼起来就是要维护的队列。

当一个栈为空却要pop时,将另一个栈从中间砍成两半,暴力重构两个栈的信息。

可以证明是\(O(n)\)的。

现在来思考这个东西与双指针的关系。

我们发现维护双指针很像维护双端队列。

baka's trick可以解决双指针中这样的困境:

结果便于支持加入,合并,但删除的复杂度错了。

可以联系一下回滚莫队,我们把删除操作改为撤销操作,不能撤销了就暴力重构。

具体而言:

  1. 在两个指针\(l,r\)之间再维护一个\(mid\),初始时\(mid=r\)

  2. 我们不再单纯地维护\([l,r]\)这一段的值,而是维护\([l,mid]\)这一段的后缀信息,以及\((mid,r]\)这一段的前缀信息。

  3. 若移动指针后\(l>mid\),便使\(mid\gets r\),然后暴力重构\([l,r]\)之间的信息。

  4. 查询时将两段拼起来就好。

这样子在均摊下是对的,但我不会证。

队列

先进先出,没啥好讲的,主要是运用。

单调队列

很强,可以优化DP,或者自成一题。优化DP的方式看DP去。

单调队列保证队列中的东西具有单调性,方便查询最值(或类似的东西)。

一种常见模型是单调队列配合双指针。观察题目性质可以发现指针移动的单调性,然后两个指针之间用单调队列维护一下。

例如:

Luogu P3594

给定一个长度为 \(n\) 的序列,你有一次机会选中一段连续的长度不超过 \(d\) 的区间,将里面所有数字全部修改为 \(0\)。请找到最长的一段连续区间,使得该区间内所有数字之和不超过 \(p\)

对于 \(100\%\) 的数据,\(1 \le d \le n \le 2 \times 10^6\)\(0 \le p \le 10^{16}\)\(1 \leq w_i \leq 10^9\)

Sol:

显然无论如何改成\(0\)的区间的长度要尽量取到\(d\),设前缀和为\(sum_i\),该区间的右端点为\(i\),则删掉的数的和为\(sum_i-sum_{i-d}\)

观察一下,对于一段合法的区间\([l,r]\)\(r\)增大时,\(l\)单调不减。

所以双指针套单调队列。

实现细节见代码。

Code
#include<bits/stdc++.h>using namespace std;
typedef long long ll;const int maxn=2e6+10;
ll n,p,d,h,t,ans,w[maxn],sum[maxn],q[maxn];ll max(ll a,ll b){return a>b?a:b;
}int main(){scanf("%lld%lld%lld",&n,&p,&d);for(int i=1;i<=n;++i){scanf("%lld",&w[i]);sum[i]=sum[i-1]+w[i];}int j=1;h=1,t=1;q[1]=d;ans=d;for(int i=d+1;i<=n;++i){while(h<=t&&sum[i]-sum[i-d]>sum[q[t]]-sum[q[t]-d]) t--;q[++t]=i;while(h<=t&&sum[i]-sum[j-1]-(sum[q[h]]-sum[q[h]-d])>p){j++;while(h<=t&&q[h]-d+1<j) h++;}if(sum[i]-sum[j-1]-(sum[q[h]]-sum[q[h]-d])<=p) ans=max(ans,i-j+1);}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857466.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCIe扫盲——PCIe总线事务层入门(一)

在介绍事务层之前,首先简单地了解一下PCIe总线的通信机制。假设某个设备要对另一个设备进行读取数据的操作,首先这个设备(称之为Requester)需要向另一个设备发送一个Request,然后另一个设备(称之为Completer)通过Completion Packet返回数据或者错误信息。 在PCIe Spec中…

2024 新版DataGrip安装使用教程(附激活至2099年,以及常见问题处理)

DataGrip 简介 在数据库管理与开发领域,JetBrains 推出的 DataGrip 无疑是一款备受瞩目的工具。它以其对多种数据库引擎的广泛支持而著称,为开发人员和数据库管理员提供了一站式的便捷解决方案。 DataGrip 支持 MySQL、PostgreSQL 等开源数据库,能让使用这些流行数据库的开发…

解锁宠物用品行业的市场密码:看板软件如何助力精准用户调研?

看板软件可以通过数据可视化与分析、供应链优化、售后管理与服务提升以及品牌建设与用户互动等方式,为宠物用品行业解决用户调研中的痛点问题。然而,需要注意的是,看板软件只是解决方案的一部分,企业还需要结合实际情况和市场需求进行综合考虑和实施。宠物用品行业用户调研…

惊!冬至物流大忙,哪类办公软件能增强团队应急能力?

一、前言 冬至期间,物流行业面临着巨大的挑战与机遇。电商平台的促销活动让订单如潮水般涌来,物流 J 人团队需要高效协作,确保每一个包裹都能准确无误且迅速地送达客户手中。在这个关键时期,合适的可视化团队协作办公软件成为了提升工作效率与个人学习效率的得力助手。本文…

触摸芯片之滑条滚轮方案

完美解决了传统用户界面操作复杂和触摸响应异常的问题触摸芯片的常见应用形式:触摸按键模式 触摸滚轮模式 触摸滑条模式触摸按键-触摸开关、控制面板的多按键触摸 触摸滑条/滚轮-触摸调光、调音量、速度、进度、大小家电的状态 智慧家居必备神器——触摸芯片,触摸反应灵敏,无…

DL00358-基于YOLOv8的停车空位检测代码含数据集

YOLOv8(You Only Look Once Version 8)是基于深度学习的目标检测算法,近年来在图像处理领域取得了显著进展,尤其在实时目标检测任务中表现出色。停车空位检测作为计算机视觉应用中的一个重要研究方向,旨在通过智能化系统识别和判断停车场内的空闲车位,为车主提供实时的停…

小迪安全-基础入门-Web应用架构类别源码类别镜像容器建站模版编译封装前后端分离

Web应用&架构类别&源码类别&镜像容器&建站模版&编译封装&前后端分离知识点: 1、基础入门-Web应用-搭建架构上的技术要点 2、基础入门-Web应用-源码类别上的技术要点 一、演示案例-架构类别-模版&分离&集成&容器&镜像 1、套用模版型 c…

流量分析基础篇

1.流量分析是什么?  网络流量分析是指捕捉网络中流动的数据包,并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。2.常见的流量包协议TCP ; UDP ; HTTP ; HTTPS ; FTP ; SMB 等TCP / UDP传输机制TCP协议传输先向你发送三次握手建立…

.net framework 4.7.2 框架winform项目升级到.net 8.0项目 log4net不起作用的解决办法

问题描述: 在.net framework 4.7.2 框架中的winform项目,引入log4net作为日志组件使用,一切正常,可以正常输出日志。 但项目框架升级到.net 8.0后,log4net的使用就报错,虽然网上有很多关于.net 8.0配置并使用log4net的方法,但有些我尝试没有用,有些代码所在位置看不懂在…

纯js文字洗牌式切换特效插件

ShuffleText是一款纯js文字洗牌式切换特效插件。该插件在鼠标滑过指定的文本时,文字会不停的逐个进行翻转,类似洗牌效果,非常炫酷。在线演示 下载使用方法 在页面中引入shuffle-text.js文件。< script src="path/to/shuffle-text.js"> HTML结构 ShuffleTex…

ABB机器人IO板短路怎么解决

解决ABB机器人IO板短路问题的步骤 - 关闭控制系统电源:首先,关闭ABB机器人的控制系统电源,以确保安全操作。 - 检查线路连接:检查IO板的线路连接是否牢固,有无松动或损坏的迹象。 - 使用万用表测量:使用万用表测量电路的三相是否有短路或接地现象。在测量时,…