2025.1.17 近期练习
CF1286D LCC
这个题还是比较简单的,考虑拆贡献,将所有碰撞情况拿出来考虑其出现的概率,显然只有相邻的。
按照时间排序。假设我们钦定了
例如若
然后这就是一个动态 dp 了,不需要让
矩阵+线段树维护即可。
P9068 [Ynoi Easy Round 2022] 超人机械 TEST_95
cdq 分治。考虑拆贡献到每个点对
对于单点修改每次只会产生
考虑将修改拆到
如果要 cdq 分治我们需要将其转化为偏序形式,我们将所有修改都记为
表示
那么考虑
然后得到每个时刻的变化量,最后只需要将前缀加起来即可。所以对时间这维做 cdq 即可。
注意修改是不变的情况。合并两个归并的区间可以用 inplace_merge 函数。
P5163 WD与地图
折磨。首先删边转化为加边,相当于将时间轴倒序。
我们如果能知道一条边两端点被并到一个 scc 里的时间,我们就能用线段树合并轻松解决。
观察特殊性质,对于单条边,答案满足可二分性,对于多条边的情况,我们可以尝试整体二分。
对于当前二分的时间区间
如果某条边已被缩起来,那么其之后也一定被缩,往左区间递归;反之右区间递归。
当然我们每次都取出
即我们在
然后考虑用可撤销并查集维护缩点,去左儿子
我们可以只加入
然后我们把新连边的点拿出来跑 Tarjan,这样复杂度跟区间大小挂上。
但是原来 SCC 之间连的边怎么办?我们可以忽略。如果新边和 SCC 之间边可以构成新的 SCC,
那么边集中的该条边一定会在之前的二分中被划分到答案更早的区间,所以不会出现在当前区间里。
于是每条边最多经过
P5069 [Ynoi2015] 纵使日薄西山
观察到,如果操作了
那么这个
其次,我们不必模拟整个过程,我们只需要直到哪些
考虑模型化。我们可以把问题转化为
首先
那么这是一个动态 dp 的形式,我们直接从
三个状态:取
因为我们整个过程是确定的,所以一定只有一种合法的
矩乘写
P4117 [Ynoi2018] 五彩斑斓的世界
第二分块。考虑弱化题目,如果是整体操作查询该怎么做。发现每次操作势能都减少。
设最大值为
若
那么我们这样操作只需要复杂度
考虑平移操作该如何实现,我们可以维护相同值的数位置的集合,用并查集维护。
具体是并查集维护位置的集合关系,合并就是把值所在集合的根连边过去,注意判断连过去有没有根。
那么回到原题我们可以考虑将序列分块,如果是整块的操作那么显然就是整体操作;
如果是散块的操作,我们考虑直接重构整个块。
本题卡空间,而每个块是独立的,所以我们离线每个块都做一遍即可。
CF1129D Isolation
这个题属于典题。
我们考虑加入
那么
这个显然非 poly,考虑分块,由于是加减
我们维护块里每个元素可以考虑维护一个桶表示当前值为
整块修改直接打
P6578 [Ynoi2019] 魔法少女网站
考虑没有修改弱化版。考虑将所有数从小到大加入,设已加入为
其次将所有询问离线,只需要在对应时间上查询答案即可。线段树维护。
考虑加上修改,那么相当于修改若干的
考虑操作分块后块内如何做,还是将所有数从小到大加入,对于每个询问,将其对应的改了即可。
但是我们别用线段树,因为查询是
这里省略细节。总复杂度平衡后是
不需要用到并查集,只需要维护每个值所在位置区间最左和最右。
注意规避
P6466 分散层叠算法(Fractional Cascading)
这是个模板题。考虑对
对于叶子结点,第
对于非叶子结点,我们将其左右儿子的序列从大到小,每隔
再将
对于一次询问,我们在根节点数组上二分出
设
我们需要找到
知道了左右儿子分别后继位置区间,直接暴力判断出实际位置,继续递归下去即可。
注意到单次查询每个节点贡献都是常数,所以是
线段树方法的优势在于可以支持修改和区间查询,更方便维护一些分块中多块二分的问题。
P5356 [Ynoi2017] 由乃打扑克
这个题显然分块,然后瓶颈在于多块同时二分的问题,这个问题考虑分散层叠算法,线段树实现。
因为问题带修,所以我们考虑取
区间修改打 tag,复杂度仍然
考虑查询,按照上述方法直接遍历整颗线段树即可,复杂度
考虑散块查询可以直接拎出来
查询加上二分,那么查询是
总的复杂度即
P7811 [JRKSJ R2] 你的名字。
注意到
对于
事实上线段树或分块都是
对于
而
离线,不妨将
我们需要将询问做到
每个块内分别记录前缀最小值和后缀最小值即可。注意在一个块内的询问直接暴力。
其实维护所有块 RMQ 可以直接 ST 表处理,单点修只会造成
取
P4119 [Ynoi2018] 未来日记
第一分块。跟第二分块还是很像的,都是块内维护并查集。
如果我们用二分,那么不可避免多块同时二分问题,如果采用分散层叠的话还不能支持区间打 tag。
看到值域只有
整块修改只触及两个值域的位置,散块直接重构即可。所以修改是
考虑查询操作就是先取出散块然后
复杂度
P4192 旅行规划
转化为区间加等差数列,区间
由于等差数列+等差数列还是等差数列,我们只需要维护(块内)全局标记
考虑如何快速求全局
跟斜率相关的式子我们可以转化为凸包。这是一个上凸包的形式,我们只需要在凸包上二分即可。
于是每个块维护凸包,整块只需要 +tag,散块直接重构,复杂度
P9962 [THUPC 2024 初赛] 一棵树
由于贡献是在边上算的,我们自然想到以子树划分子任务进行树形 dp。
设
得到
优化
那么我们就可以考虑用闵可夫斯基和来
考虑用数据结构维护差分数组,比如平衡树,用启发式合并维护。
考虑处理加上函数
复杂度
P5986 [PA2019] Szprotki i szczupaki
贪心显然是每次选最大能吃的吃。当前最小不能吃的鱼只会变化
那么我们考虑依此给贪心分段。
具体地,设当前最小不能吃的鱼为
注意此时可能不止能吃
CF809D Hitchhiking in the Baltic States
如果按照正常的 dp 设
不妨设
若当前区间为
若
注意到
考虑二分出
转移相当于
具体操作用平衡树实现。最后答案即为平衡树的大小。
CF1416E Split
属于是数据结构优化暴力。设
感觉这个
只需要支持单点修改,全局推平,全局加,全局翻转,求全局
将
P5494 【模板】线段树分裂
关于 FHQ-treap 合并两个值域相交的部分,复杂度势能分析解决。
一次分裂会减少
具体地,假设合并
复杂度是
这个可以拓展到区间取模,也是可以势能分析且复杂度正确。
势能分析待学习。
CF1455G Forbidden Value
不难有一个简单的 dp 设
但是转移很难受,因为我们要跳过一个 if 从以前的版本转移,所以考虑建树。
然后做树形 dp,线段树合并处理。这个玩意叫“整体 dp”?
CF671D Roads in Yusland
树上问题考虑以子树为子任务划分。设
那么考虑合并
考虑线段树合并处理。考虑在合并的时候记一下后缀
考虑把路径挂在深度较深的点上,设存在
合并完
所以我们线段树除了合并操作只需要实现区间最小值,单点 chkmin,区间加即可。
为什么复杂度是对的?考虑势能分析,注意势能不是
这也是被称为整体 dp,还是比较地基础的。
写垃圾回收节省空间。
CF671E Organizing a Race
考虑什么条件下
那么条件是
考虑我们操作
先考虑
贪心地依次对
再考虑
由于之前每次操作一定会操作到
考虑先在单调栈上二分出一个区间
考虑满足
在二分过程中顺便维护前缀最大值。所以线段树维护
Loj#6029. 「雅礼集训 2017 Day1」市场
首先观察到
关于区间整除,做法是暴力递归所有区间直到
考虑势能分析。设势能为
对于除法操作,每个连续段满足
对于加操作,内部势能不变,两边增加了
所以总的势能是
卡老师讲考虑容量为极差。若极差为
Loj#6507. 「雅礼集训 2018 Day7」A
考虑区间容量为“同时含有
考虑
具体地,若
注意 tag 的先后顺序。
这个势能可以设计为
CF793F Julia the snail
考虑利用
考虑从小到大扫,那么若当前扫到
考虑直接套用 Segbeats 的结论。每次操作若不是操作最大值,至少将最大值和次大值合并,势能减少。
而总势能是
还是维护最大值,次大值即可。修改最大值的时候最大值是谁是不会变的方便维护。
P5609 [Ynoi2013] 对数据结构的爱
这是一个线段树维护分段函数的问题,注意到函数的断点个数显然不超过区间长度。
考虑维护
考虑 pushup。若
合并是
观察到:
所以关于更新
询问的话直接拆成
一个卡常技巧,“查理线段树”,令左儿子为
uoj#637. 【美团杯2021】A. 数据结构
考虑更换贡献方向,考虑询问离线,用每个出现
进一步地,考虑正难则反,计算不出现的
有两个条件:
相当于
将
将两矩形求交,那么
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具