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\) 个点的方案。转移:

\[f_{i,j}=\sum\limits_{k=1}^{i-j}f_{{i-j},k}\times \dbinom{n-1-(i-j)}{j}\times 2^{\frac{j(j-1)}{2}}\times (2^k-1)^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\) 进制实现。

posted @ 2024-09-11 11:41  xishanmeigao  阅读(5)  评论(0编辑  收藏  举报