数据结构-黄洛天
数据结构-黄洛天
A - 冰火战士
题面
支持
- 添加一个三元组
- 撤回第
此操作,此操作保证为报名信息
每次操作后,求
以及取到最值的最大的
题解
有一个很显然的
考虑优化,我们发现,树状数组上的
当从
复杂度
方法
- 倍增同时
查询树状数组中的值。
代码
B - Fenwick Tree
题面
有一个长度为
题解
每次修改相当于给某个点到根加一个数字。
我们从低向上考虑整个树,依次判断是否要给当前节点操作。假设他有
-
,子树内所有操作对于我的影响是 . -
,子树内所有操作对于我的影响一定非 0 -
,子树内所有操作对于我的影响是任意的。
因此只有
方法
-
考虑贡献
整体考虑子树对父亲的贡献。
C - Traveling in Cells
题面
有
-
:将 修改为 -
:将 修改为 -
:求
题解
对于每一个
对于第三个操作,本质上是找到左与右第一个的没有出现在
int RP(vector<int> u,int pos,int L=1,int R=n){
if(Cnt(u)==R-L+1)return n+1;
if(L==R)return L;
int mid=L+R>>1;
if(pos<=mid){
int res=RP(lson(u),pos,L,mid);
return res==n+1?RP(rson(u),pos,mid+1,R):res;
}else{
return RP(rson(u),pos,mid+1,R);
}
}
int LP(vector<int> u,int pos,int L=1,int R=n){
if(Cnt(u)==R-L+1)return 0;
if(L==R)return L;
int mid=L+R>>1;
if(pos>mid){
int res=LP(rson(u),pos,mid+1,R);
return res==0?LP(lson(u),pos,L,mid):res;
}else{
return LP(lson(u),pos,L,mid);
}
}
方法
- 最近元素查找模型——线段树左右第一个查找法,代码与上类似
D - k-Maximum Subsequence Sum
题面
长度为
-
修改某个位置的值。
-
询问区间
里选出至多 个不相交的子段和的最大值。
一共有
题解
要求
线段树需要维护:区间和,前缀和最大值,后缀和最大值,区间和最大值,前缀和最小值,后缀和最小值,区间和最小值,以及每种最大最小值取到的方案。
时间复杂度
方法
- 线段树结合贪心
代码
E - Max Mex
题面
给定一棵有
题解
考虑使用线段树维护维护值域,也就是对于值域区间
查询时记录当前维护值域之前的信息,进行合并
方法
-
线段树维护其他信息
线段树不一定维护数值信息,只要是有结合律的操作都可以,比如本题的合并。
代码
F - The Fair Nut's getting crazy
题面
给定序列
解法
令
则对于一个合法四元组
易得最远情况下,
所以
这关乎两个变量,所以假设我们枚举
当
由于计算的下边界都是
展开得:
用线段树分别维护即可
抽象化方法
-
先数学化,再推导
-
多变量关联情况——枚举+维护
如上式中会出现一个同时与
相关的式子,我们可以考虑枚举一个,维护一个 -
维护法——拆式子
将式子拆开,分别维护每一部分,要比维护整体更简单
G - Useful Algorithm
题面
定义
给定长度为
解法
对于每一位维护一棵线段树即可
抽象化方法
-
进制下第 位进位是指 -
拆式子——交换内外循环
本题中将外循环变为每一位,内循环变为数,以简化处理
-
形如
,可以化为 ,用线段树进行维护二元运算
可以为 等存在逆元的运算
H - Vacation
题面
给定序列
单点修改,查询区间中长度不超过
题解
参考题解:GYM103861F 解题报告
先将序列按照长度
最终答案仅可能来自于两种情况
-
属于一个块
-
跨过至两块
对于第一种情况,我们直接维护一个普通的最大子段和。
对于第二种情况:答案一定由一个后缀加上一个前缀组成。令
所以说,我们需要维护三种线段树
-
维护最大字段和
-
对于每一块,维护与前一块
拼接情况 -
对于全局,维护前两种线段树在考虑完整段时的答案
下面是具体操作:
修改
修改整棵最大子段和线段树的答案并更新维护答案的线段树
对前面块的后缀和进行前缀加并更新维护答案的线段树
对后面块的前缀和进行后缀加并更新维护答案的线段树
查询
令
-
当
直接询问最大子段和 -
当
,此时将一个块分为了三个部分 ,答案来自于三种情况。取最大值即可。
-
-
当
,答案来自于两种情况-
中间部分,即
中的整段最大子段和同 中的完整跨段关系。 -
两边部分,转化为两个情况二。
-
时间复杂度
方法
-
分段维护线段树
-
将两端之间有关联的信息放入一个线段树进行处理。
J - Game: Celeste
题面
数轴上有
解法
用线段树维护所选集合。考虑单调队列优化 DP。
按照字典序每次选出最“大”的集合,转移就是以此版本为基础建立可持久化线段树。
比较集合大小就用线段树上二分,如果
抽象化方法
-
维护集合——权值线段树
-
可持久化数据结构——一种转移关系
所以可以用来DP
-
数据结构比大小,定义其大小关系,以便用在
等情境中。
K - 道路建设
题面
给定平面上
题解
为了方便先离散化,把
因为
因为我们限定了只考虑横坐标在一个点
-
当
时, -
当
时,
所以查询距离
考虑从右到左扫描线,用主席树维护区间
如果要找第二小值,就把第一小值对应的
方法
-
离散化
在离散化时去重就是相同对相同,在离散化的时候不去重并加上标记就是相同对不同,这样离散为不同有助于许多情况的简化。
-
可持久化的修改
新建节点——再次可持久化,以避免对后续版本造成影响。
-
扫描线
从一个方向至另一个方向的动态线段树信息就是扫描线,这样确定了一个枚举(处理)顺序,方便处理
L - 树
题面
给定一棵
设
其中
请你求出
题解
将
考虑如何全局加一。
我们发现对一个数加一在二进制下的步骤可以解释为,找到最低为的
回到这颗0/1树上,可以解释为先交换一个节点两条边下面的两棵子树,再向交换后的
考虑维护异或值,我们可以考虑每条边的贡献。如果一条
时间复杂度
方法
-
01-trie 可以用来维护一些数字的异或,支持修改
其插入、删除、全局加一、全局减一(从递归
边变为递归 边)、合并操作都十分常见。注意
M - 众数
题面
定义众数为序列中出现次数严格大于一半的数字。
一开始给定
有
:在 号序列末尾插入数字 。 :删除 号序列末尾的数字。 :求 合并后的众数。不存在返回 。询问中的合并操作不会对后续操作产生影响。 :新建一个编号为 的序列,其为 号序列后顺次添加 号序列中数字得到的结果,然后删除 对应的序列。
题解
方法
- 主席树+链表
N - 楼房重建
单侧递归线段树
题面
维护一个序列,在线单点修改,求出每一时刻各段的前缀最大值数目。
题解
既然是线段树,首先考虑如何合并信息。
如图,黑线两侧是一个节点的左右子树,很明显左子树的答案我们是一定要保留的,对于右子树,我们应该保留那些比黄色的线更高的节点,如果直接用可持久化平衡树维护每个子树中的所有点,一次去
我们知道,在有序的序列上二分查询比一个数小的复杂度是
这个问题也就是一次上传是
方法
-
线段树维护单调序列
也就是本题的一个套路
-
线段树的
Up
可以看作一个从来是线段树的重中之重,在分析时,我们可以将其看作一个新的问题,这个问题又可以有多种解法,比如说这题,查询黄线上的数,就可以在线段树上再次递归实现,不仅如此,我们可以将其他数据结构、算法等知识运用其上,解决问题。 -
本题也可以使用 T 题的方法达到
P - Rikka with Data Structures
题面
给定序列
有
- 区间加
- 区间赋值
- 给定
:计算满足 的 的数量。
题解
可以注意到
复杂度小常数
方法
-
最近元素查找模型
-
单侧递归线段树
S - Bear and Bad Powers of 42
题面
定义一个正整数是坏的,当且仅当它是
给定一个长度为
有
1 i
查询 。2 l r x
将 赋值为一个好的数 。3 l r x
将 都加上 ,重复这一过程直到所有数都变好。
题解
T - 前进四
题面
单点修改,询问
题解
很明显有一个
如果我们把时间当作空间的一维,那么一个序列上的操作其实是在二维平面上的操作,如图:
我们在时间轴上进行扫描线,单点修改,维护前缀信息。
而这道题,我们发现查询是一个单点修改,维护后缀信息,然而修改却只在一个时间段有效,所以对于这道题,可以考虑将其转过来。
变成一个区间赋最小值,后缀序列扫描线。
方法
- 考虑时间维度
作者:lupengheyyds
出处:https://www.cnblogs.com/lupengheyyds/p/18303127
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下