高一讲课

news/2025/11/7 17:05:54/文章来源:https://www.cnblogs.com/Zelensky/p/19200272

又叫后进先出表

给出一个栈常用功能的实现

struct sta{int tp,a[(int)1e7];void push(int x){a[++t]=x;}int top(int x){if(t==0)return -1;return a[t];}int size(){return t;}void pop(){if(t==0)return ;else t--;}
}s;

push(x) 向栈内压入一个元素

top() 查询栈顶

pop() 弹出栈顶

size() 栈中元素个数

单调栈

问题引入

P5788

维护一个栈,使得栈中元素单调

考虑如何维护一个栈内元素递增的栈:

1.若栈为空或栈顶大于当前元素,直接压入当前元素

2.弹出栈顶

我们发现使某个位置弹出栈的元素编号就是这个位置的答案

于是得到以下代码

#include<bits/stdc++.h>
using namespace std;
int a[1000000*4];
int f[1000000*4];
stack<int> s;
void expush(int x){while(!s.empty()&&a[x]>a[s.top()]){f[s.top()]=x;s.pop();}s.push(x);
}
int main(){cin.tie(0);ios::sync_with_stdio(false);int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){expush(i);}for(int i=1;i<=n;i++)cout<<f[i]<<" ";
}

例题

P10334

考虑无解,由于一个时刻只能做一杯饮料,所以当饮料数大于当前时刻,直接输出无解.

倒序计算出相邻两个顾客顾客之间的间隔,尽量在最晚的时间做好.

P10798

取反操作对绝对值限制无意义,只可能通过改变端点值改变威胁区间个数

P9461

P10174

P7167

""水会流入半径大于这个圆盘的圆盘中"",容易想到单调栈.

把圆盘向其后第一个半径大于他的连边,构建出一棵树(根节点为水池),倍增维护.

队列

先进先出表

队列常用功能

struct ccc{int a[1000000],t=0,h=1;void push(int x){a[++t]=x;}void pop(){h++;}int front(){return a[h];}int size(){return t-h+1;}bool empty(){return (t-h+1)==0;}
}q;

单调队列

问题引入

......

考虑维护一个由队首到队尾单调的队列,队首即为该区间的答案

以区间最大值为例:

  1. 如果队首元素不在当前区间内,则弹出队首
  2. 若队尾小于当前元素,弹出队尾
  3. 当前元素入队

代码如下

 h=1,t=0;for(int i=1;i<=n;i++){while(h<=t&&q2[h]+m<=i) h++;while(h<=t&&a[i]>a[q2[t]]) t--;q2[++t]=i;if(i>=m) printf("%d ",a[q2[h]]);}
}

例题

P2827

经典老题

暴力: 堆模拟,注意其余蚯蚓的长度会增加.

正解: 排序,发现 切之前,前半段,后半段分别单调,开三个队列维护

P6033

同上

P4944

deque的应用,应该都做了.

小根堆

priority_queue<int,vector<int>,greater<int> >q;

大根堆

priority_queue<int>q;

DAG

谁把这玩意放这儿的?

性质

  1. 能拓扑排序的图一定是有向无环图,有向无环图一定能拓扑排序.
  2. 从一个点出发,一定不会回到这个点

拓扑排序

拓扑排序要解决的问题是如何给一个有向无环图的所有节点排序。

因此我们可以说 在一个 DAG(有向无环图) 中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 \(u\)\(v\) 的有向边 \((u,v)\) , 都可以有 \(u\)\(v\) 的前面。

还有给定一个 DAG,如果从 \(i\)\(j\) 有边,则认为 \(j\) 依赖于 \(i\) 。如果 \(i\)\(j\) 有路径( \(i\) 可达 \(j\) ),则称 \(j\) 间接依赖于 \(i\)

拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

构造拓扑序列

  1. 从图中选择一个入度为零的点。
  2. 输出该顶点,从图中删除此顶点及其所有的出边。

重复上面两步,直到所有顶点都输出,拓扑排序完成,或者图中不存在入度为零的点,此时说明图是有环图,拓扑排序无法完成。

Kahn 算法

算法流程

初始状态下,集合 \(S\) 装着所有入度为 \(0\) 的点, \(L\) 是一个空列表。

每次从 \(S\) 中取出一个点 \(u\) (可以随便取)放入 \(L\) , 然后将 \(u\) 的所有边 \(( u , v_1) , (u, v_2), (u, v_3)\) 删除。对于边 \((u, v)\) ,若将该边删除后点 \(v\) 的入度变为 \(0\) ,则将 \(v\) 放入 \(S\) 中。

不断重复以上过程,直到集合 \(S\) 为空。检查图中是否存在任何边,如果有,那么这个图一定有环路,否则返回 \(L\)\(L\) 中顶点的顺序就是构造拓扑序列的结果。

int n, m;
vector<int> G[MAXN];
int in[MAXN];  // 存储每个结点的入度bool toposort() {vector<int> L;queue<int> S;for (int i = 1; i <= n; i++)if (in[i] == 0) S.push(i);while (!S.empty()) {int u = S.front();S.pop();L.push_back(u);for (auto v : G[u]) {if (--in[v] == 0) {S.push(v);}}}if (L.size() == n) {for (auto i : L) cout << i << ' ';return true;}return false;
}

关于例题,你们会在晴空幻梦的tarjan例题里见到的,这里先放两道简单的.

最小生成树

定义

在图的边集中选择 \(n - 1\) 条,将所有顶点连通。

Kruskal

为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入生成树,如果某次加边产生了环,就扔掉这条边,直到加入了 \(n-1\) 条边,即形成了一棵树.

查询两点是否连通和连接两点可以使用并查集维护。

#include<bits/stdc++.h>
using namespace std;
int fa[10000000];
struct edge{int u,v,w;
}e[10000000];
bool xx(edge a,edge b){return a.w<b.w;
}
int get(int x){if(fa[x]==x)return x;return fa[x]=get(fa[x]);
}
int main(){int n,m;cin>>n>>m;for(int i=1;i<=m;i++)cin>>e[i].u>>e[i].v>>e[i].w;for(int i=1;i<=n;i++)fa[i]=i;sort(e+1,e+m+1,xx);int cnt=0,ans=0;for(int i=1;i<=m;i++){int fx=get(e[i].u),fy=get(e[i].v);if(fx==fy)continue;fa[fx]=fy;cnt++;ans+=e[i].w;if(cnt==n-1){cout<<ans;return 0;}}puts("orz");return 0;
}

prim

基本思想是从一个结点开始,不断加点.

具体来说,每次要选择距离最小的一个结点,以及用新的边更新其他结点的距离。

其实跟 Dijkstra 算法一样,每次找到距离最小的一个点,可以暴力找也可以用堆维护。

#include<bits/stdc++.h>
#define mr make_pair
using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >  q;
struct ccc{int to,nxt,w;
}e[(int)1e6];
int head[(int)1e6];
int cnt,tot,ans;
void add(int u,int v,int w){e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
int n,m;
int dis[(int)1e6],vis[(int)1e6];
void prim(){for(int i=1;i<=n;i++)dis[i]=1e9,vis[i]=0;dis[1]=0;q.push(mr(0,1));while(!q.empty()){if(tot>=n)return ;int nw=q.top().second,d=q.top().first;q.pop();if(vis[nw])continue;tot++;ans+=d;vis[nw]=1;for(int i=head[nw];i;i=e[i].nxt){int v=e[i].to,w=e[i].w;if(dis[v]>w){dis[v]=w;q.push(mr(w,v));}}}
}

次小生成树

非严格

显而易见地,我们应该用某条未选边替换已选边中的最大边

例如 \(e(u,v,w)\) 我们可以找到生成树上 \(u\)\(v\) 路径上的最大边权,再用当前未选边替换,按此流程遍历所有未选边,答案的最小值即为最终答案.

考虑到生成树是一棵树,所以可以使用树上倍增 LCA 在 \(O(\log n)\) 的时间内处理单次询问.

严格

仍然沿用非严格次小生成树的思想.

考虑特殊情况,即未选边与路径上最大边权值相等的情况,这时我们不能替换最大边,而应替换严格次大边,因此只需多维护一个路径上严格次大边的权值即可.

仍使用树上倍增维护,单次询问 $ O(\log n) $

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

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

相关文章

Windows 10 本地部署本地知识库 RAGFlow + Qwen3 1.7B

参考豆包 https://www.bilibili.com/video/BV1WiP2ezE5a/ (视频教程) https://blog.csdn.net/zengmingen/article/details/143687404 https://zhuanlan.zhihu.com/p/49335520708 https://github.com/infiniflow/ragf…

2025 最新儿童早发育产品口碑推荐榜:药食同源调节性腺轴 + 权威测评认证,十大优选品牌最新推荐

引言 儿童早发育问题已成为家长群体关注的核心健康议题,相关产品市场需求持续攀升,但品质参差的现状让选购决策愈发困难。为提供权威参考,本次榜单联合儿童健康协会、营养监测中心及儿科研究机构,基于《儿童保健杂…

Ubuntu通过命令行安装REALVNC

复制本地安装包文件到其他服务器 scp /home/jzrobot/VNC-Server-6.11.0-Linux-x64.deb jzrobot@192.168.10.149:/home/jzrobot 安装程序 sudo dpkg -i VNC-Server-6.11.0-Linux-x64.deb 激活许可 sudo vnclicense -add…

气氛

即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。反之亦然同理,推论自然成立。略去过程 $\rm QED$,由上可知证毕。

2025年室内展厅LED显示屏厂家权威推荐榜单:室内沙盘显示屏/室内显示屏/酒店LED显示屏源头厂家精选

在数字化展示时代,室内展厅LED显示屏已成为信息传递与体验升级的核心载体。一份权威的厂家推荐榜单能为您的选择提供可靠参考。 室内展厅LED显示屏作为企业形象展示、产品呈现与信息交互的重要窗口,其技术水准与显示…

2025 年最新推荐集装箱拖车公司榜单:全方位解析优质厂家实力,助力企业精准选合作商

本次榜单由行业权威协会联合专业测评机构共同打造,测评过程严格遵循 “多维度、重数据、强实操” 原则,涵盖资质认证、技术实力、资源配置、服务质量、客户口碑五大核心维度,共设置 28 项细分指标。测评机构抽取近 …

MATLAB实现自适应卡尔曼滤波(AKF)

一、理论基础与算法原理 自适应卡尔曼滤波(AKF)通过动态调整过程噪声协方差矩阵Q和观测噪声协方差矩阵R,解决传统卡尔曼滤波在噪声统计特性未知或时变场景下的性能退化问题。其核心改进体现在:噪声自适应机制:根据…

2025年制作遮阳棚厂家权威推荐榜单:室外遮阳棚/自动伸缩遮阳棚/伸缩遮阳篷源头厂家精选

在户外生活空间备受重视的今天,一款优质的遮阳棚已成为连接室内外生活的重要桥梁,不仅能有效拓展活动空间,更能提升建筑的整体美感与实用性。 随着户外生活理念的普及和建筑空间利用率的提升,遮阳棚市场正迎来稳定…

下载Google Play 的APK,这样可以不用XAPK

https://apkmody.com/-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------(蓝奏云官网如果有地址失效了,可以私信我,后续看到会补充)…

单点登录相关

单点登录相关 @Controller public class HelloController {/*** 无需登录就可访问** @return*/@ResponseBody@GetMapping(value = "/hello")public String hello() {return "hello";}@GetMapping(…

在Ubuntu上配置Nginx实现开机自启功能

要在Ubuntu系统中配置Nginx以实现开机自启,我们可以通过系统的服务管理工具 systemd去实现。systemd是大多数当前Linux分发版使用的初始化系统和服务管理器,它允许你管理服务的启动行为。 安装Nginx 首先,确保你已经…

详细介绍:从零开始的C++学习生活 5:内存管理和模板初阶

详细介绍:从零开始的C++学习生活 5:内存管理和模板初阶pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

阿里云的边缘加速ESA

阿里云的边缘加速产品ESA,即是CDN又是安全防护产品。 最近还搞活动,每月可领免费基础版。 免费领取链接:http://s.tb.cn/e6.0Fu67m测速速度不错:

2025年广场喷泉订做厂家权威推荐榜单:喷泉/假山喷泉/音乐喷泉源头厂家精选

在城市景观升级与文旅融合发展的浪潮下,广场喷泉已从单一观赏设施演变为集艺术、科技与生态于一体的复合型景观,而定制厂家的专业能力直接决定了项目的最终价值。 广场喷泉作为现代城市公共空间的核心景观元素,其市…

Java映射操作:深入Map.getOrDefault与MapUtils方法

在Java中,Map接口是一种非常基础与广泛使用的数据结构,它存储键值对(key-value pairs)的集合,并且允许按照键(key)快速检索相应的值(value)。对于 Map的操作中,getOrDefault方法和Apache Commons Collection…

扫描线算法 矩形面积并 线段树与扫描线结合

关键是理解这里点对应的是一个区间,用来表示一段线段长度。要解决矩形面积并问题,高效的方法是扫描线算法结合线段树离散化,能处理高达 105 个矩形的规模。 核心结论 扫描线算法通过 “竖线扫描 + 区间更新” 计算面…

改善深层神经网络:第一周优化算法(二)——Mini-batch 梯度下降汇报总结

一、引言 在深度学习模型的训练过程中,优化算法起着至关重要的作用,它直接决定了模型参数更新的方式和效率,进而影响模型的收敛速度和最终性能。在改善深层神经网络的第一周学习中,我们深入探讨了多种优化算法,其…

有度即时通重拳打击电诈行为,守护企业信息安全

近年来,电诈活动已成为整个即时通讯行业面临的严峻挑战。只有积极构建安全防线,才能让企业用户安心使用,避免因电诈分子使用同类产品而受到牵连。为此,有度即时通开展了一系列扎实有效的工作。近年来,电诈活动已成…

基于pytorch卷积神经网络的汉字识别系统

基于pytorch卷积神经网络的汉字识别系统源代码如下(pycharm//附运行结果):import osimport shutilimport randomimport numpy as npimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils…

制图-学习日志

lth 开始时间:2025-11-07 更新时间:2025-11-07 QGIS\Aerialod{{image.png(uploading...)}}