9月杂题
[ABC310F] Make 10 Again
分母是 \(\prod a_i\),只需求分子。
首先要发现投出了 \(10\) 以上的点数是无用的,所以只需考虑 \(10\) 以内的。
思考如何计数,发现转移依赖于前面的点数和的方案数,而且 \(10\) 很小,考虑状压 DP,设 \(f_{i,s}\) 表示前 \(i\) 个骰子,状态为 \(s\) 的方案数,转移不表。
\(s\leq M=2^{11}\),所以时间复杂度 \(\mathcal{O}(nM10^2)\)。
[ARC174E] Existence Counting
怎么就没想到呢??一直想着直接计数,比较困难,正难则反,转化为:排列数 \(-\) 没出现 \(x\) 的排列数 \(-\) 字典序大于 \(P\) 的方案数 \(+\) 既没出现 \(x\) 字典序还大于 \(P\) 的方案数。转化后就比较基础了。
[ARC173C] Not Median
感觉还是不够。
直觉告诉我们,答案大多数都很小。
注意到答案很大的地方周围应该长这样 -+-+-+0-+-+-+
,这告诉我们只需找到两个相邻的值又同时在 \(p_i\) 一侧的就好了。
每个点都往左右扫,复杂度看似 \(\mathcal{O}(n^2)\),但是其实在 \(i\) 和 \(x_1,x_2\) 之间的所有数答案一定是 \(3\),这意味着每个数只会被扫一遍。所以时间复杂度 \(\mathcal{O}(n)\)。
[ABC281G] Farthest City
将所有点按最短路分层,每层的节点只能和相邻层还有层内的节点连边。设 \(f_{i,j}\) 表示用了 \(i\) 个点,最后一层有 \(j\) 个点的方案。转移:
CF1476F Lanterns
典题,覆盖问题可以将状态设计成 \(f_i\) 表示前 \(i\) 盏灯能覆盖的最长前缀。
转移分三类:
- 前面不能覆盖到 \(i\),直接不管 \(i\),\(f_i=f_{i-1}\)。
- 前面能覆盖到 \(i\),\(f_i=\max(f_{i-1},i+p_i)\)。
- 将 \(i\) 向左,找到一个 \(f_j\ge i-p_i\) 最小的 \(j\),然后 \(j+1\sim i-1\) 全部向右,\(f_i=\max\{k+p_k\}\)。
不知道为什么想这么久,明明这么简单。
[ARC154C] Roller
有 ARC182B 作为基础这题很容易想到做法,将相同的合并成一块,只需判断是否存在一个断点使得 \(a\) 是 \(b\) 的子序列。
但是还需要空余的位置,可以是 \(a\) 中 \(b\) 没出现的,可以是 \(b\) 中相邻的,也可以是 \(a\) 中相邻的。若没有空余位置则必须 \(a,b\) 完全相等。
细节一直写挂,数组还开小了。
P3214 [HNOI2011] 卡农
想不出来。
设 \(f_i\) 表示选了 \(i\) 个子集且满足条件的方案。考虑容斥,为了满足和前面的 \(i-1\) 个子集加在一起全是偶数,前面每种选法都唯一确定一种子集,方案数为 \(A_{2^n-1}^{i-1}\)。
再减去 \(i\) 为空的情况,方案数为 \(f_{i-1}\)(去掉 \(i\) 之后能满足条件)。
再减去 \(i\) 和前面相同的方案。去掉 \(i\) 和 \(j\) 后也能满足条件,\(j\) 有 \(i-1\) 种取值,子集 \(i\) 有 \(2^n-1-(i-2)\) 种取法,方案数为 \(f_{i-2}\times (i-1)\times (2^n+1-i)\)。
最后输出 \(\dfrac{f_m}{m!}\)。
P3577 [POI2014] TUR-Tourism
在无向图搜索树上 DP,没见过。
由题得树的深度不超过 \(10\),这启发我们用树上状压 DP(还是没见过)。
一个重要的性质:无向图 DFS 树上的非树边一定是回边,不存在横叉边。所以我们可以状压父亲的状态。
DP 过程较为复杂,不写。
P6381 『MdOI R2』Odyssey
通过质因数分解我们很容易判断是否能构成完美数对,但是信息在边上我们很难直接 DP。
但我们发现如果用哈希去表示每一条边,那么能与它配对的边的哈希值也是确定的。这启发我们设 \(f_{i,h_i}\) 表示以 \(i\) 为终点,最后一条边哈希值是 \(h_i\) 的答案,时间复杂度 \(\mathcal{O}(n\log n\times 11)\)。
P8860 动态图连通性
很牛逼。
首先肯定要离线,然后多次询问的边只有第一次有用。
记边被询问的时间为 \(d_i\),没询问的视作 \(d_i=Q+1\)。将 \(d_i\) 作为边的边权,那么就是要找一条路径,使得将路径上的边的权值从大到小排序,字典序最小。
类似 「The classic problem」一样用主席树维护最短路。
CF464D World of Darkraft
需要注意到 \(k\) 种装备地位相同,所以只需计算一种装备最后乘 \(k\)。设 \(f_{i,j}\) 表示还剩 \(i\) 个怪兽,装备等级为 \(j\) 的期望。转移不表。
[ABC370F] Cake Division
不会倍增的菜鸟了属于是。
二分答案,记 \(f_i\) 为从 \(i\) 开始的一个连续段的结尾 \(+1\)(即下一个连续段的开头),那么就是从 \(i\) 开始跳 \(k\) 次 \(f\) 看终点是否满足条件。这显然倍增。
P7603 [THUPC2021] 鬼街
减半警报器。
一次灵异事件的发生可以暴力给所有质因子 \(+y\),因为质因子个数很少。问题是什么时候统计答案。
对于一个 \((x,y)\) 的监控,记加入时其质因子已经发生了 \(s\) 次灵异事件,响警报的条件是 \(\sum\limits _{p}cnt_p\ge y+s\)。转化成 \(\sum \Delta cnt_p\ge y\)。那肯定至少有一个 \(p\) 满足 \(\Delta cnt_p\ge \lceil\frac{y}{d_x} \rceil\),我们将其设为阈值,当一个房间里有监控达到阈值时我们就拿出来 check 一下,这可以用优先队列实现。
如果 check 失败,我们让阈值变成 \(\lceil\frac{y-\sum\Delta cnt_p}{d_x} \rceil\),然后重新加入优先队列。不难发现, 每次阈值至少减少 \(\dfrac{1}{d_x}\),所以时间复杂度 \(\mathcal{O}(m\times d_V\log V\log n)\)。
[ARC171C] Swap on Tree
每棵子树最多 \(siz+1\) 种取值,且新的数是什么不重要。设 \(f_{x,t,0/1}\) 表示以 \(x\) 为根的子树,与 \(x\) 相连的边断了几条边,和父亲的边是否断了的方案数。
\(f'_{x,t,0}\leftarrow f_{x,t-1,0}\times f_{y,s,1}\times t+f_{x,t,0}\times f_{y,s,0}\)
\(f'_{x,t,1}\leftarrow f_{x,t-1,1}\times f_{y,s,1}\times t+f_{x,t,1}\times f_{y,s,0}\)
初始化 \(f_{x,0,0}=1\),\(f_{x,1,1}=[x\ne 1]\)。
P6383 『MdOI R2』Resurrection
其实就是联通块的根之间连边。
容易想到设 \(f_{x,i}\) 表示 \(x\) 上面还有 \(i\) 个点可供选择的方案数,但是不会做转移。
因为 \(x\) 的选择会使得 \(i\) 的限制发生变化,而且 \(x\) 与儿子的谁先与父亲切断对转移也有影响。平常的树形 DP 依赖于儿子的状态,而这里对父亲也提出要求。
考虑分析图的性质,然后就发现儿子连的边一定不会与父亲连的边交叉,要不连父亲,要不连父亲连的点的上面。分析出这点,然后就可以枚举父亲连的点进行转移了。
P6009 [USACO20JAN] Non-Decreasing Subsequences P
静态区间查询,考虑猫树分治。
如何合并两个前后缀信息,记 \(g_{i,j}\) 表示 \([i,mid]\) 里以 \(j\) 结尾的不下降子序列数量。将值域放到状态里即可合并。
P3523 [POI2011] DYN-Dynamite
二分答案,如何判定?
转化成满足条件的最小覆盖。(用最少的点)
如果一个子树的根到这个子树的关键节点的最远距离 \(\le mid\),那就可以选择根来覆盖整棵子树,但这样可能会重复覆盖,我们需要想一个方法减小多余的覆盖。因此我们设 \(f_i\) 表示 \(i\) 距离它子树内关键节点的最远距离,\(g_i\) 表示 \(i\) 到它子树内选定节点的最短距离。
初始化 \(f_i=+\infty\),\(g_i=-\infty\)。
转移 \(f_i=\max \{f_j+1\}\),\(g_i=\max\{g_j+1\}\)。
还有一些情况需要特判
- \(f_i+g_i\le mid\) 时,\(i\) 子树已经无需覆盖,\(f_i=-\infty\)。
- \(f_i=mid\) 时,我们此时必须选择 \(i\),则 \(f_i=-\infty\),\(g_i=0\),\(tot++\)。
- \(g_i>mid\) 且 \(d_i=1\) 时,说明这棵子树不能被子孙覆盖,需要留给父亲,\(f_i=\max(f_i,0)\)。
贪心 + DP,根本做不出来。
P8292 [省选联考 2022] 卡牌
大于 \(\sqrt{V}\) 的质数最多在每个卡牌里出现一次,可以特殊考虑,将 \(n\) 个数分组,依据是自己具有的大于 \(\sqrt{V}\) 的质数。
对每个组预处理出 \(g_s\) 表示组内凑出质数集合为 \(s\) 的质数的方案。
然后对组做 DP,设 \(f_{s,i}\) 表示考虑了前 \(i\) 个组,凑出质数集合为 \(s\) 的方案数。如果该组的质数被询问了,则不能选空。否则可以选空。但是时间复杂度不对我去你的。
问题在于每个质数在不同的合法方案中会被选择不同次数,考虑正难则反,枚举不含的质数集合,使用容斥解决。设 \(f_{s,i}\) 表示前 \(14\) 个质数不含的集合为 \(s\),是第 \(i\) 个质数(\(i>14\))的倍数的有多少个,可以预处理出来,时间复杂度 \(\mathcal{O}(2^{14}\sum c_i)\)。
P2150 [NOI2015] 寿司晚宴
仍然考虑设 \(f_{s,i}\) 表示含有的前 \(8\) 个质因子集合为 \(s\),且是第 \(i\) 个质因子的倍数有多少个。然后发现不太对啊。
正常考虑设 \(f_{s,t}\) 表示 A 选了 \(s\) 集合的质因子,B 选了 \(t\) 集合的质因子的方案数。对于存在大质因子的数,对其内部做 DP,方法同上。
CF1810F M-tree
先考虑单次询问怎么做。可以二分答案,然后让每个点尽量往深度大的放。这样就可以得出答案 \(x\) 满足的充要条件就是 \(m^x\ge \sum\limits_{i=1}^nm^{a_i}\)。所以答案就是 \(\lceil\log _m \sum\limits m^{a_i}\rceil\)。这可以用线段树维护 \(m\) 进制实现。