数据结构方法总结
数据结构方法总结
上个世纪,Niklaus Wirth 提出:程序=算法+数据结构(初赛要考qaq)
数据结构是一种处理数据的方法,很明显是必不可少的。
oi中的数据结构,除去数组,栈,队列等sb数据结构,根据复杂度可大致分为 log 结构和 sqrt 结构(我自己胡的说法,很明显不严谨)。其中log以线段树,平衡树,树套树为代表,而sqrt以分块,莫队为代表。
而这里,我们讨论一个更高层的问题:如何综合的运用这些东西。
转化
很多问题是不能直接做的,都需要转化。转化问题这件事,往往是做题的第一步/前几步。
转化有多种多样的,在数据结构题中,所做的转化需要围绕着 方便维护 来转化。
-
loj2873:“单峰序列” -> 从中间开始,递减的往两边加数,自然就会形成一个“峰”
-
loj2346:斜向操作 -> 水平竖直的操作(转坐标轴)
-
区间中不同的数 -> 只统计pre<l的数
-
区间中只出现一次 -> pre<l,suf>r
注:pre,suf是解决 “本质不同” “出现次数” 等问题的有力工具
我们联合
很多题目是不能靠一个算法搞定的,通常需要几个算法配合解决。
数据结构方面的算法,通常可以快速/块速的维护一些东西,以起到优化复杂度的作用。
有的题目甚至可以直接在数据结构上做,我没见过
比如,在线段树上跑树形dp,我纯口胡的,没见过
- CF809D:注意到这个dp有 的形式,即区间平移后区间加,用平衡树的插入与lazytag来优化
- CF573E:推出本题的贪心策略之后,用平衡树维护
- 经典应用:SAM+线段树合并
- CF833B:用上面的pre转化后,注意到 的转移相当于一个区间+区间max,线段树维护
- 经典应用:线段树优化建图
- 经典应用:树套树(这个相当于两种数据结构互相配合)
常见应用
- 区间取min:seg-beats
- 区间平移/翻转:平衡树
- 来来回回区间贡献:线段树+脑子
- 部分非强制在线题:扫描线+线段树
- 已知一个数,选一个数,max xor:trie
- 不好做的区间信息:分块
怎么只有这么点东西啊
做题少,抱歉啊qaq
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效