「Log」做题记录 2023.10.30-2023.11.26
\(2023.10.30-2023.11.5\)
\(\color{blueviolet}{AT\_abc285\_g}\)
神秘题。
网络流是显著的,建边方式如下:
- 所有边容量都为 \(1\)。
- 每个点拆为入点和出点,\(S\) 向入点连边,出点向 \(T\) 连边。
1
的入点向出点连边。2
的出点向四联通的2
或?
的入点连边?
当做上两个处理。
考虑到唯一一种使得其不可行的构造是出现奇环,但网格显著并无奇环。
\(\color{blueviolet}{CF1530F}\)
此题是神秘题。
考虑反着做,将至少有一行或一列或一条对角线全为 \(1\) 概率转换为所有行列对角线都至少有一个 \(0\)。
先不考虑行与对角线,只考虑满足所有列都至少有一个 \(0\) 该怎么做,为了使得我们的不完全做法有扩展性,我们考虑使用容斥。
过程如下:
-
加上至少有 \(0\) 列全为 \(1\) 的概率。(对于至少有 \(x\) 列全为 \(1\) 的概率,可以理解为我们选定 \(x\) 列,使得其全为 \(1\)(概率相乘),其他列的 \(0/1\) 情况我们不考虑(概率为 \(1\))。而选定的 \(x\) 列的所有情况概率要加和,比如我选定 \(1\) 列,那么情况总数有 \(n\) 种,这些情况的概率都要加和。)
-
减去至少有 \(2\) 列全为 \(1\) 的概率。
-
加上至少有 \(3\) 列全为 \(1\) 的概率。
-
以此类推。
这样容斥并不难理解,我们需要求的是所有列至少有一个 \(0\) 的情况,对于第一步加的概率显然是全情况的概率,我们减去其中有一列为 \(1\) 的概率,但此时对于两行为 \(1\) 的情况我们减了两遍。举个例子,对于 \(1,2\) 号列全为 \(1\) 的某种情况,我们选定 \(1\) 号列时和选定 \(2\) 好列时分别减去了一遍,所以要在接下来的运算中将其加回来,以此类推。
接下来考虑在这样计算列的贡献时计算行的贡献,首先每一行的贡献互不影响,考虑固定选定的列进行某一行的运算,我只要保证舍去行的全为 \(1\) 的概率即可。我们设 \(f_{i,j}\) 表示对于第 \(i\) 行,选定 \(j\) 状态列(\(j\) 是一个状压状态,这里选定其中的列就相当于在第 \(i\) 行中该位置一定为 \(1\)。),不考虑其他位置 \(0/1\) 状态的概率。这个东西显然是可以预处理的。
于是就有第 \(i\) 行在状态 \(j\) 下的贡献概率 \(g_{i, j} - g_{i, 2 ^ {n - 1}}\),其中我们减掉的是此行全为 \(1\) 的状态,也就是上文说到舍去的部分
最后对角线与列的处理相同,枚举一下状态即可,使得一行与对角线交点的位置为 \(1\) 即可。
\(\color{blueviolet}{CF1530F}\)
此题是坏题,他卡你空间。
每一个元素有选或不选两种状态,并且有依赖项,元素的贡献有正负,数据范围不大,可以自然联系到最大权闭合子图,采用最小割模型。
建模方式如下:
- 对于一个正权点 \(u\),连边 \(S \to u\),容量为 \(b_i\)。
- 对于一个负权点 \(u\),连边 \(u \to T\),容量为 \(-b_i\)。
- 对于所有 \(i\),对于其所有依赖的 \(j\) 连边,容量为正无穷。
但这样建边空间就爆炸了,考虑到值域很小,一个数不同约数个数不会很多。对于一个数 \(a_i\),枚举其约数 \(x\),对于每一个 \(x\) 只需要向最近的 \(x\) 建边即可,这样由于依赖关系的传递性不会出问题。
现在考虑最小割的意义,对于源点到正权点的一条边流满表示这个点我们舍弃掉了,对于负权点到汇点的边流满表示这个点我们被迫选择了,所以有答案 \(\left( \sum \limits _ {b_i > 0} b_i \right) - f\),其中 \(f\) 为最小割。
\(\color{royalblue}{CF1517E}\)
思考发现最后的串只能是 C/P CCC PCPCPC PPP C/P
或者 PPPPP CCCCC
这种形式,大力分类讨论,注意细节即可。
\(\color{blueviolet}{CF1511F}\)
先建 Trie 树,设 \(f_{i, u, v}\) 到第 \(i\) 个字符,两个分割分别处在 \(u\) 节点与 \(v\) 节点的方案数。
暴力转移是简单的,数据范围提醒我们要用矩阵优化,对于一个状态(有序数对)\((u, v)\) 建立一个点,若状态 \((u, v)\) 可以向 \((u', v')\) 转移,则在代表两个状态的点之间连边。
特殊地,若 \(u'\) 是终止节点,则 \((u', v')\) 同时具有 \((0, v')\) 的转移,\(v'\) 也同理;若 \(u', v'\) 都是终止节点,状态 \((u', v')\) 同时具有 \((0, 0)\) 的转移。
所以对于上述情况,\((u, v)\) 也可以向 \((u', v')\) 的等价状态连一条边,于是我们得到了一个有向图,等价于让我们求长度为 \(m\) 的从 \((0, 0)\) 到 \((0, 0)\) 路径条数,但此时状态数是 \(1600\) 左右的,显然我们不能接受,考虑优化方式。
首先对于状态 \(u, v\) 它可能是不存在的,因为 \(u, v\) 在 Trie 树上的形态必然是祖先和子代的关系,状态数来到 \(320\) 左右,再考虑 \((u, v)\) 和 \((v, u)\) 在上述图中是对称的存在,考虑在矩阵中所成一个状态即可。
\(\color{limegreen}{CF1490G}\)
塞到 set 里乱搞即可。
\(\color{limegreen}{CF1495B}\)
分讨发现当且仅当最长一个坡并且其长度为奇数才可以,模拟即可。
\(\color{limegreen}{CF1512F}\)
贪心地考虑在最后停下的位置一直拿是更优的,枚举停下位置直接计算即可。
\(\color{limegreen}{CF1468J}\)
分与 \(k\) 的大小关系处理即可。
\(\color{limegreen}{CF1475D}\)
考虑性价比最优的,双指针对于 \(1/2\) 扫一遍即可。
\(\color{limegreen}{CF1500A}\)
考虑鸽巢原理,暴力是对的!找到一个就停即可。
\(\color{limegreen}{CF1509C}\)
考虑最大最小必然在两端,相同地,对于一个最大到一定大的段,它在整合后的序列中也是连续的,进行区间 DP 即可。
\(\color{royalblue}{CF1517D}\)
DP。
\(\color{limegreen}{CF1525D}\)
无脑费用流。
\(\color{limegreen}{CF1535D}\)
考虑继承左子节点所有信息或者右子节点所有信息,直接类线段树搞就行。
\(\color{limegreen}{CF1483B}\)
塞进双端队列里,一个数对最多算一次。
\(\color{royalblue}{CF1474D}\)
考虑第一个和最后一个数操作方法固定,不交换时可以直接递推。记录前缀后缀信息枚举交换位置查看可不可行即可。
\(\color{royalblue}{CF1477B}\)
考虑倒序操作,只能将一个区间少数变为多数,线段树模拟,最后判断和初始串是否相等即可。
\(\color{limegreen}{CF1475G}\)
转换为找最长链,递推一下即可。
\(\color{limegreen}{CF1536D}\)
考虑加入两个数,中位数移动范围只有一,随便维护即可。
\(\color{royalblue}{CF1525C}\)
首先可以考虑配对,然后只剩下左边一坨和右边一坨,分别处理再考虑剩下的一或两个即可。
\(\color{royalblue}{CF1538G}\)
考虑先让两个数通过 \(a, b\) 的差值尽量相同,然后再两个两个一起整。
\(2023.11.6-2023.11.12\)
\(\color{blueviolet}{CF1499F}\)
设 \(f_{u, x}\) 表示在 \(u\) 子树内,\(u\) 向下延伸最多 \(x\) 步的方案数。转移是简单的,考虑 \((u, v)\) 这条边断不断即可。复杂度类似树形背包,需要把上下界设置好,均摊复杂度可过。
\(\color{royalblue}{CF1468A}\)
考虑 DP 方式,在最长不降子序列问题基础上,考虑两个点之间是否能添加一个更大的,简单的。
\(\color{royalblue}{CF1467D}\)
DP 处理每个点被经过次数,设 \(f_{i,j}\) 表示在第 \(i\) 次移动完后停在 \(j\) 点的方案数。因为对于第 \(i\) 次,还有剩下的 \(k - i\) 次没有走,所以答案 \(g_j = \sum \limits_{i = 1} ^k f_{i, j}\times f_{k - i, j}\),剩下的随便写了。
\(\color{royalblue}{CF1476E}\)
对于一个非模式串找到所有与其可以匹配的模式串,要求的那唯一一个模式串必须在其他模式串之前出现,变成了图论建模题,拓扑排序即可。
\(\color{royalblue}{CF1485F}\)
考虑 DP,设 \(f_{i, j}\) 表示到第 \(i\) 个数,和为 \(j\) 的方案数。转移是显著的,一种转移相当于平移,维护一个标记即可;另一种需要维护一个所有 DP 值的和。
\(\color{royalblue}{CF1491E}\)
对于一个大小为 \(f_i\) 的树,找到一个大小为 \(f_{i - 1}\) 或 \(f_{i - 2}\) 的子树时,那么剩余的大小也是一个斐波那契数,类似点分治的向下进行即可。
\(\color{royalblue}{CF1536E}\)
结论题。
\(\color{royalblue}{CF1510D}\)
考虑 DP,乘积过大就转对数,好 Trick。
\(\color{blueviolet}{SP2916}\)
简单维护最大子段和,端点情况进行讨论即可。
\(\color{royalblue}{CF1220E}\)
一个边双里面的贡献显然都可以取到,先缩点,缩点后变成一棵树 \(f_{i, 0/1}\) 表示节点 \(i\) 回来 / 不回来最大能得到的贡献(有点麻烦了),简单转移即可。
\(\color{blueviolet}{CF510D}\)
裴蜀定理会给出答案。直接 DP 就行,\(f_i\) 表示 \(\gcd\) 为 \(i\) 时的最小花费,用 map 存一下,每次遍历转移即可。
\(\color{blueviolet}{CF1038E}\)
区间 DP,\(f_{i, j, t1, t2}\) 表示区间 \([i, j]\) 中的色块,合并为一个(不一定全要用)一端点为 \(t1\),另一端点为 \(t2\) 的价值最大值,转移是简单的,特殊考虑翻转即可。(这个做法是假的,只是反例较为特殊!)
\(\color{royalblue}{CF1038E}\)
考虑转移是暴力转移是简单的,线性的东西考虑用矩乘优化,建一下即可。
\(\color{black}{CF1474F}\)
对于每一种最小值不同的答案,每一个答案的下标两两不交,可以考虑对于每一个最小值分别处理。
设 \(f_{i,j}\) 表示第 \(i\) 段为止,以 \(j\) 结尾的上升子序列个数,可以考虑用矩乘优化转移。
\(\color{black}{CF1476F}\)
设 \(f_i\) 表示前 \(i\) 个能照亮的最大前缀,二分转移即可。
\(\color{royalblue}{AT\_joisc2015\_b}\)
T2,最终答案形态固定,直接枚举起点即可。
\(\color{Lavender}{AT\_joisc2015\_e}\)
T3,讨论下无解情况,数列值域要求连续,随便计数即可。
\(\color{royalblue}{AT\_joisc2015\_c}\)
T4,设 \(f_i\) 表示取第 \(i\) 个,只考虑左侧的最大贡献,线段树优化一下,前后做两遍即可
\(\color{blueviolet}{CF1487F}\)
神秘的数位 DP,状态设完之后考虑其中两位可能很大,但通过结论可以证明大于一定程度时不优,进行剪枝即可。
\(\color{blueviolet}{CF1534F2}\)
处理出来一个节点能被覆盖的最左最右,然后转换为区间覆盖,贪心求解。
\(\color{royalblue}{CF1534F1}\)
上题简单版。
\(\color{royalblue}{CF1499E}\)
考虑 DP 即可。
\(\color{royalblue}{CF1528C}\)
第二棵树转 DFN 序乱搞即可。
\(\color{royalblue}{CF1468M}\)
根号分治。
\(\color{limegreen}{P9836}\)
质因数分解后显著的贪心即可。
\(\color{blueviolet}{P9837}\)
神秘构造,神秘的解决即可。
\(2023.11.13-2023.11.19\)
\(\color{black}{P4117}\)
第二分块。
\(\color{black}{CF1535F}\)
首先 \(f(x, y)\) 是个诈骗函数,值只可能为 \(0, 1, 2, 1337\) 其中的一种,\(0, 2, 1337\) 都好求,只需要考虑 \(1\) 的贡献。
首先考虑将字符串按照构成分组,一组一组解决,组与组之间都是 \(1337\)。
对于一组,考虑一个串 \(s\),对于其一段极长有序段 \(l, r\),与它 LCP 大于等于 \(l - 1\),LCS 小于等于 \(r - 1\) 的串都可以构成函数值为 \(1\) 的贡献。
想到正反建 Trie 数,于是相当于求出符合 \(l1 \le dfn1_i \le r1 \land l2 \le dfn2_i \le r2\) 的 \(i\) 个数,将第一维限制拆成前缀然后直接二维数点即可。
\(\color{black}{CF1528E}\)
将问题转化一下,树的形态被简单限制,钦定一个点只有两个子节点进行树个数 DP,巨大分论即可。
\(\color{blueviolet}{CF1487G}\)
诈骗题,最多两个数字超出范围,打进两维状态,设一个胖 DP,稍微优化一下即可。
\(\color{royalblue}{CF1184E2}\)
没水平题。
\(\color{royalblue}{P8280}\)
胖 DP,状压,然后状态堆到一块即可。
\(\color{blueviolet}{CF1093G}\)
直接维护 \(32\) 种情况即可。
\(\color{royalblue}{CF506D}\)
根号分治。
\(\color{blueviolet}{CF1468B}\)
神秘题,拿 set 维护一段一段的,每次合并两个,按照 \(k\) 递减顺序。
\(\color{blueviolet}{CF1468B}\)
神秘的 set 乱搞。
\(\color{blueviolet}{CF1479D}\)
异或哈希加主席树即可。
\(\color{blueviolet}{CF1481E}\)
神秘的 DP。
\(\color{royalblue}{CF1497D}\)
神秘的 DP。
\(2023.11.20-2023.11.26\)
\(\color{royalblue}{P3806}\)
点分治板子。
\(\color{blueviolet}{P4178}\)
点分治板子。
\(\color{blueviolet}{P4149}\)
点分治板子,稍微维护一下一个长度路径至少需要几条边即可。
\(\color{black}{P2664}\)
静态点分治。
考虑颜色对端点的贡献,首先特殊化根的答案以及贡献,这部分是简单的,然后考虑子树内节点的答案以及贡献。
设 \(f_x\) 表示节点 \(x\) 的贡献,对于一个节点 \(x\),若其祖先节点中没有和其同色的,有 \(f_x = siz_x\),否则 \(f_x = 0\)。
对于某点 \(x\),考虑一条 \(x\) 到 \(y\) 的路径,将其分为 \(x \to \mathrm{root}\) 以及 \(\mathrm{root} \to y\) 两部分分别考虑贡献。
对于前者,考虑此部分的每个颜色,都会在 \(y\) 取到不同的点的时候造成一次贡献,所以每个颜色会产生 \(siz_{\mathrm{root}} - siz_{\mathrm{branch}}\) 的贡献,其中 \(\mathrm{branch}\) 表示 \(x\) 所在的子树。
对于后者,考虑每个节点都会造成一次贡献,所以有贡献 \(\sum \limits _ {y \notin \mathrm{branch}} f_y\)。
考虑两部分贡献可能多算,因为颜色可能有重复,也就是说统计 \(\mathrm{root} \to y\) 部分贡献时只能累加不在 \(x \to \mathrm{root}\) 路径上的颜色的贡献,我们选择额外减去其贡献。
对于一个点 \(x\),一次计算中有其答案(设 \(x \to \mathrm{root}\) 路径上的颜色集合为 \(C\)):
其中 \(\sum \limits _ {y \notin \mathrm{branch}} f_y = \sum \limits_{i \in T_{\mathrm{root}}} f_i - \sum \limits_{i \in mathrm{branch}} f_i\),然后写巨大多 DFS 就可以解决了。
\(\color{blueviolet}{P6329}\)
动态点分治模板,需要处理的部分很多,细节也一坨。
\(\color{blueviolet}{P3345}\)
动态点分治,首先考虑在点分树上移动找最优点,然后动态点分治计算贡献即可。
\(\color{blueviolet}{P3241}\)
考虑点分树每个节点维护到其父亲的信息,开一个 vector 保证有序即可。
\(\color{blueviolet}{CF741D}\)
树上启发式合并板子,颜色状态记录奇偶即可,状态压进桶里即可。
\(\color{blueviolet}{P3380}\)
树套树模板。
\(\color{blueviolet}{P3759}\)
树套树维护二维偏序。
\(\color{blueviolet}{P4093}\)
树套树优化 DP 转移。
\(\color{black}{P5692}\)
第四分块(加强版)。
\(\color{black}{P5397}\)
第四分块。
\(\color{blueviolet}{P3825}\)
首先不考虑 \(x\),2-sat 是显著的,考虑枚举 \(x\) 状态,再进行 2-sat。
\(\color{royalblue}{CF549B}\)
神秘构造,模拟即可。