专栏文章
9 月做题记录
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minw0sx4
- 此快照首次捕获于
- 2025/12/02 09:16 3 个月前
- 此快照最后确认于
- 2025/12/02 09:16 3 个月前
R14
T1
略。
T2
通过一些观察,我们发现操作序列一定形如
C P C P P P C P P ...。我们将每一段长度记为 ,有 段,则字符串长度为 ,花费为 。
我们需要在满足 的前提下,最小化 。
根据均值不等式, 一定越平均越好,我们也可以用调整法证明:。
注意到 ,直接枚举。 和 的分界点也可以直接枚举。然后二分出 的值。
总 。
T3
首先染色容易想到倒着做,这样变化会少不少。
然后区间 DP,不过显然我们只需关心区间长度,于是 表示使用到倒数第 个颜色,区间长度为 ,终点位于左/右端点的方案数。
可以更新到 ,其中颜色 在 内部跳, 跳出去。转移可以考虑用 表示否能转移到,套一层 DP 计算即可。
T4
我们设 为经过节点 的路径个数。显然 。
我们经过手玩和大胆猜想,试图证明可以取等。
考虑归纳构造的套路。如果我们能选出一个集合,使得 减 ,那么我们就完成了证明与构造。
显然选择方法就是选择若干无交路径,覆盖所有 的点。再具体一点,我们每次选择 最大的最浅点 ,并选择以其为 LCA 的路径。这样的路径总是存在的,否则 的父亲会是更浅的符合要求的点。该过程可以用树剖 + 线段树加速。
R15
T1
数数问题,考虑清楚方案的生成方式就不难。
T2
神秘构造题。
考虑最大效用的发挥每条线的作用。当一条线满足 时,该线在每列都能覆盖 格。
于是第一步连 与 ,往下每次两端点移动两个就能高效覆盖下半部分。
上半部分是对称的,我们可能会先考虑连 和 。但由于最后边缘部分会有漏的,要用额外两条线补充,所以这样构造可能 。
所以我们先连 和 ,这样就没问题了,。
T3
神秘计算几何 + 数数。
首先凸多边形的面积计算可以拆成三角形,我们需要锚定一个点,注意这个点是任意的,并不一定要是给定点中的,明白这一点才会有后面灵活的贡献拆解。
要注意边的方向问题,我们规定边一律指向顺时针方向,然后可以用原点到边两端点的叉积判断正负。
于是我们发现一条边对应一个三角形,依次考虑每条边的贡献, 地枚举所有边,考虑它在多少个 中出现,可以 解决。
T4
神秘贪心 + 推式子 + DS。
把 变成 以变成前缀和问题。
先考虑解决单次查询的静态问题。我们有一个贪心解法:
- 从左到右依次选数,如果某次选数会使得前缀和 ,删除该数。
- 在已经得到的序列上倒着如是做一遍。
其正确性是显然的,最优性的证明也不难。
用 表示前缀和, 表示后缀和。因为这个问题有多次查询和修改,我们需要看看有没有从这两个数组出发简便得到答案的方法。
OBS 1:第一次删除的个数为 。
每次删除都相当于 的后缀 ,通过一定手模不难看出。
令第一次删除后的后缀和为 ,则第二次删除个数为 。
OBS 2:。
注意删除的都是 ,所以是显然的。
一共删除 。
这里需要一些 运算技巧,与 类似。
我们容易看出这其实是一个最大子段和。
证明:P10334 [UESTCPC 2024] 饮料
神秘贪心题,至今不会证。
P10875 [COTS 2022] 游戏 M
连通性相关。
P10680 [COTS 2024] 双双决斗 Dvoboj
根号分治,小块分治数组,大块递归。
AT_arc201_c [ARC201C] Prefix Covering
字符串优先考虑 Trie。
AT_arc201_b [ARC201B] Binary Knapsack
神秘贪心题,考虑奇偶性。
若 为奇数,不妨先选择一个价值最大的 的物品,然后把 减 。
于是 的物品只能选偶数个,我们可以贪心的两两合并成 的物品,如果剩下单个就舍弃。
此时 和所有物品的重量都是偶数,可以全部除以 。
AT_arc203_c [ARC203C] Destruction of Walls
比较复杂的数数题。有一定的转化和巧思。
自己做的时候把路径长 的情况漏了。
https://www.luogu.com.cn/article/zvf63hbo
难:AT_arc202_c [ARC202C] Repunits
神秘数学题。
用到 min-max 容斥和莫比乌斯反演,还有一点和式手法。
https://www.luogu.com.cn/article/w2d98cnb
AT_arc197_c [ARC197C] Removal of Multiples
观察到删除并不会使数过于稀疏,所以可以直接暴力线段树。
严谨点的说法是质数 一定在 的时候被删除,所以至少大约第 个质数还留着,线段树开到 。
AT_abc209_e [ABC209E] Shiritori
字符串双端作点,字符串作边。注意不要用字符串作点,不然边数很多,而且不是标准的有向图游戏。
初始时无出边的点必败。在删点过程中,没有被标记为必胜,但无出边的点也必败。
然后将确定状态的点删去,为什么?
- 如果必败,其前驱必胜,该打的标记都打完了,留在图中没有用。
- 如果必胜,其前驱一定会避免走到该点,其存在与否不会影响前驱的必胜与必败。
最后未删的点是平局的,因为每个点在原图都没有必败后继(否则它就是必胜的,会被删去),且它不会走到原图的必胜后继,否则就输了。然后此时没有无出边的点,所以会永远周旋。
难:AT_arc165_f [ARC165F] Make Adjacent
先考虑局部,对于两个数字,有 aabb、abab、abba 三种情况。其中前两种都是变成 aabb 最优,后一种随意,操作次数的下限分别是 。
我们可以证明,存在方案使得对于每一对数字都能取到下限。
解释:我们每次操作只会影响到两个数字间的相对关系,所以这里的下限是影响了两个数字间相对关系的操作次数。显然总下线就是任意两个数字的下限和。(要理解清楚需要灵活的视角,主体是一个机械的过程,这个过程中会不连续地对不同数对间的操作代价产生贡献)
若 且 ,则连边 ,求字典序最小的拓扑序。
这样边数是 的,由于是二维偏序,所以可以用 CDQ 优化建图或者主席树优化建图(不会)。
难: AT_arc199_c [ARC199C] Circular Tree Embedding
为树, 为排列。
OBS:随意钦定一个根节点, 合法当且仅当 的任意子树在 上是连续的(环的意义下)。
证明不难,必要性可以看出,充分性可以归纳考虑。
对元素做映射,使得 。这样区间就和值域吻合了,后面更加方便。
令 表示 的 区间的树的个数。
转移考虑以 为根,左右是区间构成的森林,用 表示。
考虑到还有其他排列的限制,我们预处理值域 ,是否在所有区间上都是连续的。它只用于判断 是否是 ,因为这无法通过方程直接算出。
其他排列的限制看起来存在感有点低,但确实如此。
好:CF1628D2 Game on Sum (Hard Version)
博弈论 DP + DP 优化。
首先博弈论 DP 一定画出决策树,这样十分清晰。
设 表示 次减法, 次加法的最终得分。
画出 关于 的图象,发现十分优美。
得到
通过一定展开,发现可以把贡献拆开计算,答案跟路径计数有关。
小结:很久没见过跟函数图像有关的 DP 优化了,还是要多尝试。
难:CF843D Dynamic Shortest Path
我们为什么构建 Johnson 图?
因为在这个图上的最短路都是 。
每次给 条边加权,最短路至多增加 。这样我们就可以不用
priority_queue 而是用桶来实现 Dijkstra,使得总复杂度降一个 。我陷入了什么误区?
我以为 Johnson 图中选取的势能是增加完 条边的边权后的 。但这样显然是无法直接得到的(不然我不就直接找到最短路了吗?)。
事实上我们选取的 是加权前的。
这个误区的根本是什么?
Johnson 图只要求一个图和一个势能即可。对于图和势能的关系没有任何要求,而我误以为势能一定要选择图的最短路。
放到这里,我们用的是加权后的图和加权前的 构成 Johnson 图。加权的过程不改变势能。
怎么避免?
- 理解清楚势能与图的关系。
- 一步一步了解我们需要做什么。
难:CF1163F Indecisive Taxi Fee
代码较难
我们有四种情况:
- 改小,边在最短路。直接减。
- 改小,边不在最短路。全最短路和过边最短路取 。
- 改大,边不在最短路。不用管。
- 改大,边在最短路。最复杂,展开讨论。
首先我们能想到如果不是最短路必经边,并不会影响答案。但仍避免不了必经边的 case。所以我们不用管必经与否。
朴素的想法是处理出删去每一条最短路上的边后的最短路。最短路有多条,但钦定一条比较方便解决问题,记为 。
我们得到一个线性结构(最短路),考虑维护一个线性 DS 解决这个问题,线段树即可做到。
具体地,我们对于每个点 ,记录 为 到 的最短路与 的公共前缀的最右端的边的编号。这里的两条最短路在同一个最短路树上,也就是没有构成环。 与之对称。
为了方便,我们用 分别表示 。
我们枚举每条边 ,对 中 到 之间的边进行 checkmin。整理成数据结构题,可以用吉司机树在线做,或者普通线段树离线做(从大到小枚举避免 checkmin),或者
multiset 离线做(扫描线)。这样为什么是对的?
我们只需证明:对于任何一个 上的边 和 的删边最短路在 之外的部分 ,存在 更新了 。
假设所有的 都没有更新 ,则在 上一定存在一对相邻的边 , 与 在 上构成的区间包含了 。
我们记 用于更新的最短路分别为 ,我们可以调整一下两条最短路使得 ,则至少有 或 。矛盾。
关于求 :
求最短路树即可。注意倒着的时候要固定 那一部分。
P3530 [POI 2012] FES-Festival
考虑极端情况是分析问题的一般方法。我们考虑 DAG 和 SCC 的情况。
对于 DAG:显然解在数轴上可以无限拉长,只要按字典序排列。所以答案就是点数。
对于 SCC:显然变量两两之间的差值都有了上下界。
OBS:这个图是很紧凑的,边权都是 ,所以对于任何一个解,变量的数轴上的分布都是连续的。
现在我们的任务变成了,最大化两个变量之间的差值。
任意两个变量之间的差值的最大值是它们之间的最短路,这是一个经典结论。
于是我们的答案就是任意两点最短路的最大值,还要 ,因为要算上起点的 。
一般图:答案就是所有 SCC 的答案加起来,因为 SCC 由 DAG 连接,区间之间可以被扯得无限长。
AT_abc345_f [ABC345F] Many Lamps
首先奇数无解。
My solution:首先观察到我们只需要找一棵生成树即可,因为非树边是可以通过树上路径平替的,另外还发现我们可以改变树上任意两点的状态。然后按照 DFS 序构造,一次点亮一个儿子和父亲。可能会在叶子上遇到孤立点,我们记下来等 DFS 到一个不亮的点再一起点亮。
Other solution:我们每次操作都是让亮的灯数 。用中值定理的思想, 到 的所有值我们都是可以构造出来的。还是找生成树,具体的构造方法 DFS 从子树开始构造,每次都操作当前点和一个儿子,保证儿子都点亮。
这种中值定理的思想比较重要。
典:CF888G Xor-MST
首先建 Trie。
Kruskal 做法:观察到对于 Trie 上的两棵子树间连边显然不如子树内连边优,但要求连通,所以只要有一条。于是可以递归连边,连跨子树边的时候用启发式合并或者直接合并都行(因为树高有限),合并的时候贪心走 Trie。
Boruvka 做法:求一个块的最小边的时候先把块内的点从 Trie 上删掉,然后对每个点贪心走 Trie,最后加回来即可。
难:CF2041N Railway Construction
囊的过分的一道题(
考虑根号分治。
Tips:
- 认为 与 同阶。
- 由于禁用边和完全图的性质,本题复杂度分析有大量均摊。
先算静态问题:
将点按 排序,先进行一轮魔改 Boruvka。前 个点不连安全边,后面的点只连前 个点。
具体地,类似 ,只有前面若干个禁用边连续的时候才会起效,于是我们判断当前点的第 条禁用边是否连向 即可。
这样会形成若干菊花图和若干单点。菊花图中,前 个点作花心。单点数为 。, 取最小。
故总块数 。
处理出两两块之间的最小边,跑不带堆优化的 Prim 就完成了。
具体地,我们记块 之间的边数为 ,由完全图的性质,我们要尽量选择 中小的点去连 中最小能连的点,而这些禁用边至多 ban 掉 中前 个点,我们扫描前 个点即可。总复杂度是 的。
关于怎么求最小能连的边,既然有了根号,不妨大胆些。用一个
vector 存下任意两个块之间的边。然后枚举每一对块,利用边现场建新图,然后用上面的方法即可。复杂度 。
动态问题:
如果删去的是 MST 上的叶子,显然是容易的。
而非叶子个数为 ,原本的花心,加上 Prim 每步至多产生 个非叶子。
所以如果删非叶子,直接重跑 MST。
总复杂度 。
无解情况(图不连通):
- 直接输出两个 。
- 只有一个孤立点,则除删该点外,其他都是 。
- 否则所有都是 。
小结:
根号方法其实是万用的,它能让很多暴力具有优秀的复杂度,又不过分依赖题目的性质,不妨多多尝试。
代码细节:
非常非常多。这里仅列出现 TLE 后的问题。
t不能太小,否则m过小的时候就会有问题,可以取max(n,m)。- 清除
f的过程忘了以cnt为上限,导致复杂度假了。这启示我们对于从代码不能明显看出复杂度的题,要用一个计数器来检测一下计算量。 define int long long的常数有点大,卡常时要关掉。
AT_abc424_f Adding Chords
赛场上想到了 Hash 做法,可惜太颓了不想写。
首先断环成链,这一步无需任何代价。考虑给边的两端打赏正负标记,查询时只需求区间和就能判断是否有交。
刚开始想用 和 ,但显然不同边会相互影响,为了去除影响,我们给每个点赋随机权值(或者 ),就解决了。
这很像某和哈希。
(哈希就是给结构赋值)
AT_arc206_d LIS ∩ LDS
神秘构造题。题解
比较合理的做法是爆搜出小规模的情况,人肉构造还是太吃注意力了。
典:P12444 [COTS 2025] 发好奖 / Hijerarhija
DFS 序的树形 DP。
挺有收益的一道题。虽然之前做过类似的题,但并不熟悉。
小结:
- 这类题通常有两个转移方向:子树内、子树外。
- 转移只需要最简转移,当前点不选的方案也可以更新到子树内,但我们不用管。就好像 LIS 也可以一次拼接两个数,但没必要。
- 转移方向跟当前点的选择有关。我们当然可以搞个 位来辅助。但更巧妙的是把状态描述改为左闭右开区间: 表示考虑 DFS 序中 人,使用 奖金的最大积极性。
树上背包的经典优化技巧能不能用于这道题?
P12449 [COTS 2025] 吸尘 / Usisavač
又被构思题创飞了。
我们定义高度 为 往子树中能走的最远距离, 为深度。
经过一定的手玩,我们发现在高度大的位置,每条边至少经过 次。并且下界可达。
而高度小的边(其较深端点 满足 )至少 次。并且下界可达。
又由于 DFS 的原因,又一条从 到叶子的经过次数还能再 。我们让这个叶节点为最深的点即可取到最优解。
其中 是仅和 有关的,可以用双指针轻松求解,用个数组存下来(离线)。
P12359 [eJOI 2024] 古迹漫步 / Old Orhei
虽然很简单,但是线段树优化游走还是有点意思的。
因为
e 数组 M 写成 N,调了半天。越界也是可能 WA 的,如果发现有玄学错误,记得检查边界。难:P12448 [COTS 2025] 观草 / Trava
套路数据结构题。
我还是喜欢从代数角度推理。
做法一:
常见技巧:
对于本题,
但是这个 并不好处理,我们不妨转换成 。拿最大值减去 即可。
这样我们的目标就是对每个 ,求满足 的长为 的区间数量。
我们可以维护 为长为 的极长区间数量, 为长度和。但我们不可能每次都扫一遍 ,所以我们维护的 和 为各个 和 的和。
而且 的范围很大,我们可以将 排序后,每次加入一个 的时候,把历史中的 都结算一下(就是几何的扫描线)。这里也可以用左闭右开技巧,每次只结算历史的,而不结算当前的,这样好写。
还需要一个并查集来维护。
此时我们解决的静态问题。
关于修改,注意我们修改的 的定义,所以变成 ,也就是在我们对 扫描时出现得晚了一个单位。这个对 和 的影响是在可控范围内的,写一个二分和区间修改即可。
做法二:
类似 NOIP2024 T4,计算每个点的贡献,最后好像可以用 CDQ 处理修改,但我不会(
CF2151E Limited Edition Shop
我们不妨重标号使得 。记 为 Alice 选择的物品集合。
OBS: 合法 若 ,则 。
换言之,若 ,则 。
于是 考虑 的前 个元素,最大 的元素为 的最大价值和。
转移:考虑 向后转移。若 被选择,转移到 ,需要满足 ;若不选择,转移到 ,不需要条件。
可以分讨展开,接下来用线段树维护 DP 数组即可。
小结:
我们设计状态的时候,把限制较为直接的搬进状态里是更有利于转移的。
原本的想法: 表示前 个元素,只考虑 的元素的最大价值和。
它无法进行优化,甚至 都要上数据结构优化。
难:P11239 [KTSC 2024 R2] 跳跃游戏
暴力 DP: 跳到 的最大得分。。
为了方便,把 整体右移一下。。
Trick 1:注意到我们只关心,后 位的值,所以可用循环数组。更新时,。等价于 后与前一个数 chkmax。
这个 trick 是经典的。
OBS 1: 的相同值极长段的数量是 的。
我们考虑把若干个连续的、相同的 合在一起转移。
CPP L-----
---x-----
---y-----
---z-R
该图是一个 段在 上的投影形态。
L 和 R 是端点,x、y、z 都是是与 L 对齐的位置。我们批量处理第一行:
OBS 2:对每一位 再与前一位 chkmax 等价于,集体 后再集体 chkmax。
于是我们可以用线段树维护(先假设 比较小)。由于 是单增的,所以循环之后就是两段单增拼到一起,chkmax 可以通过二分 + 区间覆盖实现。
贪心:从
x 开始,不需要考虑 的转移情况,因为总是不如 优。于是从
x 到 z 都可以批量加,最后再补加 z 到 R。离散化:离散化是数据结构优化后考虑的,此时的 比较大,但由于 的段数有限,所以投影到 上的关键点也有限。
弱项:P11915 [PA 2025] 瞬间传送 / Teleport
枚举答案是最优化问题的常见技巧,其优化就是二分答案。
从大到小枚举能获得更多信息。
我们设当前枚举到的答案为 。我们需要检查是否存在 边 使得任意 的距离 。
我们考虑用 淘汰 。
若 ,设 ,则需要满足 ,否则 就是不可行的。可以证明,我们不需要考虑 的情况,因为这种方案不如不用 。
我们可以枚举 ,对每一个 ,维护 (看题解的时候没理解到这里也是跟 有关的)。
这里的实现需要一些均摊。
小结:
都是一些很朴素的程序设计技巧,但显然我并不熟练。
CF786B Legacy
线段树优化建图模板。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...