2024.8.26 近期练习
P3349 [ZJOI2016] 小星星
我们想到状压 dp,设
这样的话,转移需要枚举子集,是过不了的。这里应该使用容斥。
尝试把编号是一个
那么我们定义
考虑容斥,枚举
dp 复杂度是
用容斥是因为保证每个标号都存在很难,但是删掉某个标号的点很简单。
AGC022E
第一步是找最后剩下的是
我们想一个删的策略,使得这样删下去能把合法的都删成
那么,我们从左往右删,能用左边的
设
然而这么做很蠢,我们发现,不可能欠右边那么多的
如果欠
同时不可能多出那么多
要注意的是 0 个数量和 1 的数量都要记录在状态里面。
ARC093F
我们假设已经知道了
我们标号从大到小,设其对应的子树大小为
考虑容斥,因为
我们考虑状压 dp 求出
不妨设
转移的话就是乘上
那么,合法的子树贡献怎么办呢?其实无论怎么排都是合法的,对于
P10764 [BalticOI 2024] Wall
如果墙的高度只有 1/2,那么积水的量是最后一个 2 的位置-第一个 2 的位置+1-2 的个数。
考虑拆贡献了,我们计算每个高度的答案,可以把
我们考虑计算第
这个用线段树计算,递推水的高度,每次只是单点修改。
然而
P3214 [HNOI2011] 卡农
题意是转化为有
每个音阶被奏响的次数为偶数转化为这
考虑先计算
我们假设已经选出前
若
若
还有一种情况就是
出现过的
注意我们这里要求的是无序集合,最后除以
上面那个
P3244 [HNOI2015] 落忆枫音
如果是单纯的一个 DAG 答案就是除了根每个点入度之积,即其父亲。
现在加了一条边形成环,我们考虑减掉形成环的情况,除了这个环上的点,其他点不变。
考虑计算有环的方案数,新加的边一定是必选的,如果加的是
考虑从
所以,
P3750 [六省联考 2017] 分手是祝愿
首先我们可以得出一种关灯的策略,从大到小关,如果亮着就关掉。
那么一个局面可以归类成若干个灯要关,且必须关这些灯,其他的无所谓。
因为所有灯等价,我们可以设
做一个链上高消即可。
P8290 [省选联考 2022] 填树
首先肯定是填一条链出来。这个是可以树形 dp 的。
我们枚举一个区间
每个点的取值是
我们发现我们是无法绕过枚举
但是当我们移动
但是会发生
如果是链,每个点的贡献是
我们发现我们要求就是关于
如果是树,我们发现还是
总共做
Qoj # 7884. Campus Partition
题意:把树划分为若干联通块,使得每个联通块次大权值的和最大。
注意到:若一个联通块里最大和次大的是
那么把题目转化为路径划分,且路径的权值就是两个端点最小的那个。
不妨设计树形 dp,维护
同时计算
首先
之前的
考虑用线段树合并来维护转移的过程。
CF840E
考虑到异或和加法之间的性质非常不优美,所以我们希望其能够都是同一类运算。
我们要进行的是诸如此类运算求
所以,记下每个
考虑分块,每个点维护其向上跳
P4425 [HNOI/AHOI2018] 转盘
你要想一种标记物品的策略。观察到,你如果重复经过某个点,那么只需要最后一次过即可。
所以,最优解的其中一种是只需要绕不到一圈的。
所以断环为链,选一个起点,走一个长度为
但是如何快速的计算时间是一个问题,如果起始点是
这个意思是把移动要花费的时间全部去掉。那么你现在要对所有
我们把答案改写成
事实上,这个区间可以改成后缀
维护单调栈的问题参考楼房重建,我们 pushup 的时候,先递归右边,在二分出左边怎么接上。
P9598 [JOI Open 2018] 山体滑坡
问题是:只保留
考虑操作分块,如同 APIO2019 桥梁那般。对于每
前缀和后缀同理,我们现在计算前缀的答案。
考虑扫描线,把
同时,对于每个询问,我们把询问的时间的当时还在的边加入,用完之后用可撤销并查集给撤销了。
P8990 [北大集训 2021] 小明的树
我们要想一个计算连通块个数的策略。我们不妨维护
用线段树合并来维护。可以通过
你考虑转换限制,因为点亮的灯这个限制很丑陋,我们把他转化为没点亮的灯是联通的。
然后我们用经典技巧把数没点亮的树转化为点减边,若为
考虑连接两个黑灯的边存在的时间:区间加即可。
考虑贡献,不难发现是连接亮灯和不亮灯的边的个数。这个也是区间加。
我们怎么统计总贡献呢?那么就是点减边最小值的所有位置的贡献和,线段树维护。
我们为什么要把所有计算写成边的形式呢?因为本题树的形态是变化的,每次操作都和边有关。
P3206 [HNOI2010] 城市建设
考虑分治。但是你发现只有当
但其实,你可以考虑在
第一,把
第二,强制加入
那么,我们维护并查集,对于哪些一定要被加入的边,就并查集先合并上。
通过操作二,对于
同时,因为操作一,尚待确定的边数量与点同阶。
接下来,我们分治下去,只在右边不在左边、只在左边不在右边的边将变成静态的。
我们会把这些静态的边加入,与尚待确定的边一起,进行一和二操作。
需要使用可撤销并查集。口胡完毕,实现并不容易。
P3688 [ZJOI2017] 树状数组
我们必须转化一下题目所给的 Add 和 Query。
不难发现若 Add
所以现在每次询问就是计算
也就是询问
但是这是错的,因为他们并不是独立的。 这很关键。
所以我们只能把所有
考虑修改
当
那么,这是一个矩形覆盖问题。需要树套树维护。
P8476 「GLR-R3」惊蛰
把
转移用后缀
考虑转移的本质,我们先对
对于
于是我们要支持的是区间加某数,区间把
现在我们需要的是如何实现做后缀
只需要考虑
P9531 [JOISC2022] 复兴计划
题意是:每次把边权设为
如果把绝对值拆开,分别求出最小生成树呢,那么我们只需要做的是:
把边排序,每次加入一条边权为
假设加了是
现在我们要合并两个生成树。而这是需要再做一遍 kruskal 的,所以上述只是一个不那么暴力的做法。
所以我们决定分治。观察到,把每条边单独考虑,一条边存在的时间是一个区间。
我们取出
此时在 MST 里面的边呢?其存在的区间跨越
同时,如果一条边在 MST 里,且其传的某一侧已经被其完全覆盖,那么就可以并查集并上了。
这样的话,一个边,相当于线段树,只会拆成
细节的话用可撤销并查集。同时排序的话事先排好,到时候再归并。
复杂度
P7215 [JOISC2020] 首都
我们可以发现可以求出以下关系
我们把
然后现在要求一个最小的闭合子图,考虑先缩点,然后在形成的 DAG 中找一个没有出边的最小的即可。
同时这个题还启示我们用点分治解决。
对于分治的每一层,我们令分治中心必选,然后不断拓展,最多扩展完整个子树。
如果拓展到子树外,就一定经过上一层分治中心,而上一层的答案我们已经求过,所以直接跳过即可。
所以,点分治不只是计算路径的工具,而是分治,这是我一直以来的误区。
P6845 [CEOI2019] Dynamic Diameter
首先我们有一个结论就是:两个点集的直径的四个端点中的两个是在合并之后的直径端点。
这启示我们用线段树来维护点集。一个区间代表一个点集。
现在考虑如何更新,更新一个边权,会对子树外和子树内之间的合并造成影响。
我们只需要把包含子树的区间的子集区间更新一下,其实只需从更新子树的区间往上 pushup 即可。
我们处理树上路径可以不用树剖,距离写成深度的差,然后用树状数组来维护一下子树加,单点查。
P9132 [USACO23FEB] Watching Cowflix P
我们不难对于每个
联通块的处理的话,每合并两个连通块,就减去
我们还有一种想法是因为每个边加入了就不会删除,连通块只会越来越少,我们增量地维护。
一开始的时候每个关键点作为一个连通块,我们每次都合并一些距离
所以,连通块的个数不超过
对于
因为我们一开始想的是分治,所以我们还是分治。
若分治
需要卡常,建议把树拍成 dfs 序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2023-09-04 2023.9.4 Online test