基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)

基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)

前言

这期将会讲到基础算法篇里面的数据结构(进阶),主要包括单调栈,单调队列,并查集,扩展域并查集,带权并查集,字符串哈希,Trie树。

数据结构(进阶)正文

单调栈

里面存储的单增或者单减的栈

应用:

1.寻找当前元素左侧,离它最近,并且比它大的元素在哪

2.寻找当前元素左侧,离它最近,并且比它小的元素在哪

3.寻找当前元素右侧,离它最近,并且比它大的元素在哪

4.寻找当前元素右侧,离它最近,并且比它小的元素在哪
寻找当前元素左侧,离它最近,并且比它大的元素在哪 int a[N]里面存数(已存好) ret里面存的答案 stack<int>st;//维护一个单调递减的栈,里面存的是下标 for(int i = 1;i<=n;i++) { //栈里面小于等于a[i]的元素全部出栈 while(st.size()&&a[st.top()]<=a[i]) st.pop(); //此时栈顶元素存在,栈顶元素就是所求结果 if(st.size()) ret[i]=st.top(); st.push(i); } 寻找当前元素右侧,离它最近,并且比它大的元素在哪 改成for(int i = n;i>=1;i--) 
寻找当前元素左侧,离它最近,并且比它小的元素在哪 int a[N]里面存数(已存好) ret里面存的答案 stack<int>st;//维护一个单调递增的栈,里面存的是下标 for(i=1;i<=n;i++) { //栈里面大于等于a[i]的元素全部出栈 while(st.size()&&a[st.top()]>=a[i])st.pop();//这里的符号是跟上面的唯一区别 //此时栈顶元素存在,栈顶元素就是所求结果 if(st.size()) ret[i]=st.top(); st.push(i); } 寻找当前元素右侧,离它最近,并且比它小的元素在哪 把上面改为for(int i=n;i>=1;i--)即可//n次逆遍历可以记一下是这个 
总结: 找左侧,正遍历;找右侧,逆遍历; 比它大,单调减;比它小,单调增。//构造___栈 例题: 洛谷 P1901 发射站 

洛谷 P1901 发射站

单调队列

是一个存单调元素的双端队列

应用:解决滑动窗口内的最大值最小值问题

(前面基础算法的滑动窗口不是用来求其中的最值的)

洛谷 P1886 滑动窗⼝ /【模板】单调队列

例题:洛谷 P1886 滑动窗⼝ /【模板】单调队列 int a[N]里面存的元素(已存好) 窗口内最大值: 从左往右遍历元素,维护一个单调递减的双端队列 当前元素进队之后,注意维护队列内的元素在大小为k的窗口内 此时队头元素就是最大值 代码: deque<int>q;//存下标 for(int i = 1;i<=n;i++) { while(q.size()&&a[q.back()]<=a[i])q.pop_back(); q.push_back(i); if(q.back()-q.front()+1>k) q.pop_front(); if(i>=k)cout<<a[q.front()]<<" "; } 窗口内最小值: 从左往右遍历元素,维护一个单调递增的双端队列 当前元素进队之后,注意维护队列的元素在大小为k的窗口内 此时队头元素就是最小值 

并查集

并查集是一种用于维护元素所属集合的数据结构,用双亲表示法来实现

应用eg:维护连通块的信息

相关的一些概念:

查询操作:查找元素x属于哪一个集合,一般会在每个集合中选取一个元素作为代码,查询的是这个集合中的代表元素

合并操作:将元素x所在的集合与元素y所在的集合合并成一个元素

(注意:合并的是元素所属的集合,而并非单单两个元素)

判断操作:判断元素x和y是否在同一个集合

洛谷 P1551 亲戚

并查集的实现: 例题:洛谷 P1551 亲戚 1.初始化:让元素自己指向自己即可 int fa[N];一般并查集用fa来表示 for(int i=1;i<=n;i++) fa[i] = i; 2.查询操作:就是一直向上"找爸爸"(这个find可以多次使用) int find(int x)//查询x所在集合的代表元素是谁 return fa[x] == x?x:find(fa[x]);//是x就返回x,不是就find(fa[x]) 3.合并操作:(重复合并不会出错) 让元素x所在集合的代表元素指向元素y所在集合的代表元素 void un(int x,int y) { int fx = find(x); int fy = find(y); fa[fx] = fy; } 4.判断操作 看看两者所在集合的总代表元素是否相同 bool issame(int x,int y) { return find(x) == find(y); } 

扩展域并查集

元素之间存在多种关系比如:朋友和敌人 而不像上面只存在:亲戚这样一种关系的话,就要用扩展域并查集

和普通并查集的区别:将每个元素拆分成多个域,每个域代表⼀种状态或者关系

洛谷 P1892 [BOI2003] 团伙

例题:洛谷 P1892 [BOI2003] 团伙 这里只写不同点: find和un与上面的写法一模一样 //两种关系,所以N*2:x的母敌人是x+n int fa[N*2]; //初始化: for(int i=1;i<=n*2;i++) fa[i]=i; while(m--)//m是题目中的"m个关系" { if(op == 'F') un(x,y); else//敌人,读取的是y和x是敌人关系 {//存法:这俩都得写,少一个都不行 un(x,y+n);//这两是朋友关系 un(y,x+n);//这两是朋友关系 } } 

带权并查集

概念:就是在普通并查集的基础上,为每个结点增加一个权值。这个权值可以表示当前结点与父结点之间的信息(因为find那我们用的路径压缩,因为最终这个权值是当前结点相对于根节点的信息)

洛谷 P1196 [NOI2002] 银河英雄传说

带权并查集的一些操作:(这里的d[N]以到父结点的距离为例) 例题:洛谷 P1196 [NOI2002] 银河英雄传说 新加了一个d[N] 1.初始化: 多初始化个d[i]即可 2.查询操作:(对这种代码来说,一个结点只能进行一次这种find操作!) int find(int x) { if(fa[x]==x) return x; int t = find(fa[x]);//这一步要先搞 d[x]+=d[fa[x]];//不为距离时可能会变为其他 return fa[x] = t;//完成路径压缩 } 3.合并操作://x所在集合与y所在集合合并,x与y之间的权值是w void un (int x,int y, int w) { int fx = find(x),fy = find(y); if(fx!=fy) { fa[fx] = fy; d[fx]= d[y]+w-d[x]; //可能会变,这里是拿距离举例的 } } 4.查询操作://查询y与x之间的距离 int query(int x,int y) { int fx = find(x),fy = find(y); //如果不在同一个集合中,说明距离未知(具体返回什么要看题意) if(fx!=fy)return 0x3f3f3f3f; return d[y]-d[x]; } 

字符串哈希

一般利用前缀和思想去预处理字符串汇总每个前缀的哈希值

(使用前提:需要多次询问一个字符串的子串的哈希值)

核心思想:把字符串映射成P进制数字

P一般选择13331或者131

字符串哈希的作用:

字符串哈希一般用于判断两个字符串及其各子串是否相等

(和字典树的区别是这个字符串哈希侧重于判断功能)

洛谷 P10468 兔⼦与兔⼦

例题:洛谷 P10468 兔⼦与兔⼦ 前缀字符串哈希模板: typedef unsigned lon long ULL; P = 13331; int len; string s;//一般都要搞一下s = ' '+s;来让i从1开始搞 ULL f[N];//前缀哈希数组 ULL p[N];//记录P的i次方->p[i]为P的i次方 //处理前缀哈希数组以及P的i次方数组 void init_hash() { f[0] = 0;p[0] = 1; for(int i = 1;i<=len;i++) { f[i]=f[i-1]*P+s[i]; p[i]=p[i-1]*P; } } //快速求得任意区间的哈希值 ULL get_hash(int l,int r) { return f[r]-f[l-1]*p[r-l+1]; } 如果题目只是简单的求单个字符串的哈希值: ULL gethash() { ULL ret = 0; for(int i =1;i<=len;i++) { ret = ret*p+s[i]; } return ret; } 

Trie树(又叫字典树或前缀树)

是一种能够快速插入和查询字符串的数据结构

理解:我们可以把字典树想象成一颗多叉树,每一条边代表一个字符,从根节点到某个节点的路径就代表了一个字符串

作用:

1.查询某个单词是否出现过,并且出现几次

2.查询有多少个单词是以某个字符串为前缀

3.查询所有以某个前缀开头的单词
字典树的实现: 默认需要存的全是小写字母 1.准备工作 int tree[N][26],p[N],e[N];//N一般令为所有字符串中一共有多少个字符 // p[i]表示第i个被开辟的点被经过了多少次, //e[i]表示以第i个被开辟的点为结尾的有多少个 int idx; 2.插入字符串 void insert(string&s) { int cur = 0;//从根节点开始 p[cur]++;//这个格子经过一次 for(auto ch:s) { //这个path的表达式常改!!!依据题意改 int path = ch - 'a'; //如果没有路 if(tree[cur][path] == 0) tree[cur][path]= ++idx; cur = tree[cur][path]; p[cur]++ } e[cur]++; } 3.查询字符串出现的次数: int find(string&s) { int cur = 0; for(auto ch:s) { int path = ch - 'a'; if(tree[cur][path] == 0) return 0; cur = tree[cur][path]; } return e[cur]; } 4.查询有多少个单词以字符串s为前缀: int find_pre(string&s) { int cur = 0; for(auto ch:s) { int path = ch-'a'; if(tree[cur][path] == 0) return 0; cur = tree[cur][path]; } return p[cur]; } 例题:洛谷 P2580 于是他错误的点名开始了 

洛谷 P2580 于是他错误的点名开始了

Read more

“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * “裸奔龙虾”已高达27万只!业内人士警告:一旦黑客入侵,敏感信息一秒搬空 * 阿里云 CTO 周靖人代管千问模型一号位,刘大一恒管理更多团队 * 中国传媒大学砍掉翻译、摄影等 16 个本科专业,直言教育要面向人机分工时代 * 雷军放话:小米将很快推出 L3、L4 的驾驶 * 消息称原理想汽车智驾一号位郎咸朋具身智能赛道创业 * vivo 前产品经理宋紫薇创业,瞄准 AI 时尚Agent,获亿元融资 * MiniMax 发布龙虾新技能,股价暴涨超 23% * 薪资谈判破裂,三星电子

By Ne0inhk
一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去一年,大型科技公司的裁员消息几乎从未停过。但当公司对外给出的理由越来越统一,“AI 让组织更高效”,也有越来越多内部员工开始提出另一种质疑:事情或许没那么简单。 最近,一段来自前亚马逊员工 Becky 的 YouTube 视频在开发者社区流传开来。她曾在亚马逊工作 7 年,其中 5 年担任 L7 级别的技术管理者,负责过团队年度规划(OP1)等核心管理工作——可去年,她主动离开了亚马逊。 就在最近,她的三位前同事接连被裁,其中两人还是 H-1B 签证员工,都背着房贷压力。其中一位同事忍不住给 Becky 发消息:“你去年离开的时候,是不是已经预料到会发生这些?” 对此,Becky 的回答很坦诚:她不知道具体什么时候会裁员,但她早就感觉情况不对劲了。 在她看来,这轮裁员被归因为

By Ne0inhk
用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

整理 | 梦依丹 出品 | ZEEKLOG(ID:ZEEKLOGnews) 左手是提示词的工程化约束,右手是 Context Learning 的自我进化。 在 OpenAI 新发布的《Prompt guidance for GPT-5.4》中,反复提到了 Prompt Contracts(提示词合约)。要求开发者像编写代码一样,严谨地定义 Agent 的输入边界、输出格式与工具调用逻辑,进而换取 AI 行为的确定性。 但在现实操作中,谁又能日复一日地去维护那些冗长、脆弱的“提示词代码”? 真正的 Agent,不应只靠阅读 Context Engineering,更应该具备 Context Learning 的能力。 为此,在 4 月 17-18

By Ne0inhk
当OpenClaw引爆全网,谁来解决企业AI Agent的“落地焦虑”?

当OpenClaw引爆全网,谁来解决企业AI Agent的“落地焦虑”?

2026 年 3 月,开源 AI Agent 框架 OpenClaw 在 GitHub 上的星标突破28万,并一度超越 React,成为 GitHub 最受关注的软件项目之一。短时间内,开发者利用它构建了大量实验性应用:从全栈开发辅助,到自动化营销脚本,再到桌面操作自动化,AI Agent 的能力边界正在迅速被拓展。 这股热潮也带动了另一个趋势——本地部署与算力硬件需求的快速增长。越来越多开发者尝试在个人设备或企业服务器上运行 Agent 系统,以获得更高的控制权和数据安全性。 从表面上看,AI Agent 似乎正从“概念验证”走向更广泛的开发实践。但在企业环境中,情况却没有想象中乐观。当企业负责人开始追问—— “它能直接解决我的业务问题吗?” 很多演示级产品仍难以给出令人满意的答案。 如何让 Agent 真正融入企业既有系统、适配复杂业务流程,正成为大模型产业落地必须跨越的一道门槛。 与此同时,中国不同城市的产业结构差异明显:互联网、

By Ne0inhk