2024-10 记录
10.6
# 4815. Flower's Land
给定一棵 个节点的树,和一个整数 ,点有点权,对于每个点,求出包含其的大小为 的连通块的最大价值。
。
有一个感觉挺对的做法:先求出根节点的答案,再考虑换根,换根的本质是求不含一个儿子时的背包状态,可以分治+撤回做,最终复杂度 。
正解的想法很有意思:点分治也可以用来求连通块问题。
与路径类似,我们找到分治中心 ,对于每个 求包含 的连通块最值,这样就必选了一条链,将子树按 序排序后,容易发现这条链将树分成了两个区间,于是可以转化为前后缀 背包合并,总时间复杂度 。
O. New School Term
有一个 个节点的图,有 条边,第 条边边权为 ,将图黑白染色,使黑白点各 个,总代价为连接两个相同颜色的点的边的边权之和,求最小代价。
这个边权显然是要我们从大到小谈心地选边,每次连边都是将两个二分图合并,因此 是假的,因为就算不选一条边都会使两个图反过来合并,至多合并 次。
由于最终要求黑白点数各为 ,因此每次贪心后还要检验是否存在解,可以用背包解决,对于每个合并好的二分图,记其中一类点的权值为 ,另一类为 ,一张二分图的总价值为 ,对答案的贡献可为 或 ,若能凑出 则有解。
由于二分图会合并,所以我们的背包还要支持删除物品,考虑改可行性为方案数,方程为 ,难以删除。实际上这种必选背包可转化为 背包,先令总和为 ,这样每个图可以不选或选并产生 的贡献,于是就可删除了,做到了 。
总时间复杂度 。
10.7
偷一个翻到的博客。
10.8
偶然发现一种子树直径的维护方式:先将节点按 序排序,用线段树维护直径,线段树每个点记录区间内的点的直径及其端点,由于一段 序区间可以看成缺少父亲的若干棵相邻子树,而直径端点必然是叶子结点,于是可以直接区间合并。用朴素的倍增 实现的复杂度是 的,使用 表可优化到 。特别地,挖掉一棵子树的树也可以看成一棵子树,故也可以合并。
10.10
给出一棵树,初始每个点均为白色,同时指出其中 条链,对于每条链可以且必须把这条链上的点或这条链外的点染黑,求最后剩下的白点数量的最大值。
显然有 的树剖做法,但不够优秀。
考虑每种可能的情况,本质上是将树上的点分成了 个等价点集,最终只有一个点集能为白色。划分用哈希来解决,具体的,对每条链随机一个权值并将这条链的点权异或上这个权值,两个点属于同一个点集当且仅当他们的点权相同,于是就做完了。
10.14
偷 的博客。
10.15
[ARC065E] へんなコンパス
思路比较简单,但交上去一直 。
我在动态开点线段树中每个点开了个 来维护信息,理论上空间复杂度 ,但实际上是假的, 本身就有较大空间,以下是实测空 与 的对比:
int: 8.00B
set: 56.00B
空 的空间是 的 倍!断不可乱开。树套 固然好用,但动态开点就会爆炸。
10.16
[ABC311Ex] Many Illumination Plans
直接暴力背包合并是 的,其实对于这一类树上 卷积,我们可以优化到 , 为背包中值域、编号以外的状态数。
前一个算法的瓶颈在于背包合并,考虑如何把合并改为单点加入,注意到每个节点加入背包时只与他的儿子的状态有关,且 卷积符合交换律,所以可以考虑自下而上 ,具体地,把当前的 数组下传给儿子让其单点加即可,但每层要传两次,复杂度达到 。
考虑树链剖分,每次继承重儿子的状态,对轻儿子仍用上面的做法,利用主定理可证得时间复杂度为 。
10.18
口胡了一车题,但都不想码。
Flip and Reverse
再敲打自己三遍: 序列 折线图! 序列 折线图! 序列 折线图!
转化后,不难发现题中操作为将等高的两点间的图像绕垂直于 轴的直线水平翻转。考虑建图,具体地,记前缀和为 ,令每种值为点,在 与 间连边,不难发现一次翻转使 变为了 ,也就是说边本质上是无向的,直接建无向边,跑字典序最小的欧拉路径即可。
10.21
P9870 [NOIP2023] 双序列拓展
本来以为是那年的 ,没想到最近模拟赛考了类似的还不会,遂补。
问题转化为当前的两个右端点 扩展到满足要求的 或 。不妨设要求为 ,考虑特殊性质 最大 最小。容易发现,我们扩展的其中一段为 ,然后有一段是 持续扩大,可以发现,将 扩大到一个 使 一定比 更优,因为 能比 扩展更多的 ,且即使用 跳转的 也不如用 跳转,同时还有 最小来保底 可在 扩展后再出现,所以若能扩展我们一定会直接扩展到 。对于 也同理,取 即可。
至此我们就有了一个口胡的想法,每次按 或 的单调栈扩展,若无法扩展则无解。但感觉写的不够优美,我们考虑倒过来做,从 走到 ,这样只需要记前缀最大值而不用记单调栈,一样扩展即可,非常好写。
若没有特殊性质,考虑到序列反过来配对和正着是一样的,于是把 中最大值和 中最小值左边的序列正常跑,右边的序列反过来一样跑一遍即可。
10.22
[ABC376G] Treasure Hunting
场上前期浪费了一些时间,导致 赛后两分钟才过,这题甚至还没看。
类似的题还有 P4437 [HNOI/AHOI2018] 排列、[AGC023F] 01 on Tree,我称为树上连通块贪心模型:当且仅当一个点的父亲被选择,这个点才能被选择,且前面点的选择对交换选择的相邻两个点贡献差没有影响。
对于本题,则是要求一个点的父亲要在该点之前被选择,使得 最大。显然可以套用该模型。具体地我们可以对于当前的每个连通块(初始都是单点)维护连通块内部产生的价值、点权和与大小(在具体题目中可能为别的东西),再定义一个由邻项交换推出的权重,这里连通块 的权重为 ,将每个连通块存入优先队列中,每次取权重最小的连通块与其父亲所在的连通块合并,最终得到答案。
CF2023D Many Games
首先 的肯定必须选,所以只需要考虑剩下的物品。
取 ,不妨设当前选了一些物品,总重为 ,概率为 ,收益为 ,新加入一个物品 ,新收益为 ,若收益增加,则 ,即 ,也就是 ,注意到 ,因此 !所以我们最终答案的物品总重在 级别!(当然可能会略大一些)
于是我们考虑背包,求出总重为 时 的最大值,直接做是 的。注意到对于同一种 ,我们肯定优先选 大的,同时显然 ,因此每个 选的物品的总数的总和很少,在 左右,所以在满足 的前提下 即可。
10.24
拆点法保证路径奇偶性
将点 拆成点 ,将一条边 拆成 ,这样偶数条边的路径就是从一层出发回到同一层。类似的,拆 次就可以使路径在模 意义下有相应的偏移。
10.26
树上路径覆盖贪心
例题:P7246 手势密码、CF2023E Tree of Life。
一般形式为:用最少的路径覆盖树,使得其满足题目的要求。
一般考虑自底向上贪心,在子树处先贪心地合并路径一定不劣(可以后面再拆开),于是可以以此记录状态,大分讨出结果。
原来今天是 啊:
BigIntger rp;
while(1)rp=rp+BigIntger(1);
10.27
补个游记。
10.30
模意义下的可达01背包
有 个数 ,对于 ,判断是否存在 ,,使得 。 同阶。
一眼有 的做法,但可以更优。
考虑每次新加入物品时,我们本质上是维护一个 数组 ,加入的物品大小为 就是 ,注意这里的 << 是循环移位。考虑每次找到最小的一个 ,使得 ,然后直接修改。查找可以二分,求出 与 的最长公共前缀,可用线段树做到单次 ,最终时间复杂度 。
10.31
[ARC186A] Underclued
看到 01 矩阵,(应当本能地)想到建二分图。左右部各 个点,分别编号为 ,矩阵上的 对应一条有向边,总共 条。具体的,若 ,将 与 连边;若 ,将 与 连边。若两个图相似,则两图对应点的入度、出度相等。若要将一个矩阵 做一个微小的改变,则要把一个点的一条入边变为出边,一条出边变为入边,然后递归下去,直到成环,显然这样的限制是充要的,也就是说,一条边不是固定的,当且仅当其在一个环中。转换成有向二分完全图就是在一个强联通分量内。
这样问题就转化为了把一张有向二分完全图缩点后的 DAG 上可能的边的个数,直接 dp 即可,转移是平凡的。

浙公网安备 33010602011771号