1. P8906 [USACO22DEC] Breakdown P
difficulty - \(\text{省选/NOI-}\)
这个 meet-in-the-middle 真不是人想的。
贺了官方题解。
$k$ 极小必然要用分层图;删边难以更新,时光倒流转换成加边动态最短路问题,这两个点想不出来的话就 remonk 。
首先我们只需要考虑 $k=8$ 的情况,剩余的情况都是 $k=8$ 的弱化版。
第一步 meet-in-the-middle 应该是比较显然的,即维护 $1$ 号点走到任意点和任意点走到 $n$ 号点走 $\leq 4$ 步所需要的最小路程。
但问题是我们没法在一个可以接受的复杂度内维护这个东西。
官方题解给出的下一步是:继续 meet-in-the-middle ,维护 $dis_{1,x,y}$ 和 $dis_{2,x,y}$ 表示任意点走到任意点走 $1/2$ 步所需要的最小路程。那么前者是简单的。
后者也容易维护,因为当加入 $(u,v)$ 这条边时,如果能进一步缩小答案,那么缩小的路程必然涉及 $(u,v)$ 这条边,直接暴力枚举另一个端点 $w$ 来更新 $dis_{2,x,w}$ 和 $dis_{2,w,y}$ 是每次 $\mathcal{O}(n)$ 的。
当我们有了这个东西之后,剩下的工作就简单了,暴力枚举 $(u,v)$ 的位置(第 $1,2,3,4$ 条边)来更新 $1$ 号点走到任意点和任意点走到 $n$ 号点走 $\leq 4$ 步所需要的最小路程即可。注意对 $u,v$ 的取值分类讨论保证复杂度是 $\mathcal{O}(n^3)$ ,细节略。
---
2. P8908 [USACO22DEC] Palindromes P
difficulty - \(\text{省选/NOI-}\)
转化:
考虑对一个子串 $[L,R]$ 的答案的计算方法。
1. 如果长度为偶数,而每种颜色都是奇数个,那么答案为 $-1$ ,显然。
2. 否则总是有解的。 那么我们可以暴力枚举 $L,R$ 把 $-1$ 先判掉。
问题是:有解的情况下,怎么操作答案最小?
首先我们不可能交换相邻的相同的颜色,可以得出结论:假设我们仅考虑蓝色,我们的操作必然是首尾配对蓝色,然后如果中间剩余了一个无法配对的蓝色的话把它放到正中间(由于长度为奇数,所以存在正中间)。
进一步得出:一定存在某一种最优的操作方案,使得配对的两个颜色至少一个不移动。可以感性理解一下。
那么假设有 $x$ 个蓝色,从小到大第 $x$ 个蓝色的位置是 $s_x$ ,我们的答案就是:
$$|\frac{L+R}{2}-s_{\frac{x+1}{2}}|+\sum_{i=1}^{\lfloor \frac{x}{2}\rfloor}|s_i+s_{x-i+1}-L-R|$$
前者是对中心位置的计算,可以在第一次暴力的时候顺便搞掉。
求和符号的计算比较恶心:一是有绝对值符号,二是要求配对的两个蓝色才有贡献,这就对 $L,R$ 又提出了要求。
计算:
解决方案是:我们在计算的时候不想改变 $s$ 的配对的情况,这样就可以把 $s_i+s_{x-i+1}$ 看作一个整体,所以我们枚举中心的一个或者两个 $s$ ,然后向两边暴力均匀扩展。
每次假设我们在扩展 $s_a$ 和 $s_b$ ,则我们先把 $s_a+s_b$ 加入数据结构中,进而枚举 $L\in[s_{a-1}+1,s_a]$ 和 $R\in[s_{b},s_{b+1}-1]$ 的答案。
接下来(我觉得)比较神秘:将 $s_i+s_{x-i+1}$ 扔到 BIT 里维护区间个数和区间和,直接暴力枚举 $(L,R)$ ,单次 $\mathcal{O}(\log n)$ 计算 $(L,R)$ 的答案,总复杂度是 $\mathcal{O}(n^2\log n)$ 可以通过。为什么枚举 $(L,R)$ 的次数是 $\mathcal{O}(n^2)$ 呢?因为在每次中心点不同的情况下,同一对 $(L,R)$ 只会枚举 $\mathcal{O}(1)$ 次。所以这样的枚举看起来很暴力,实际上是没问题的,而我没搞出来的原因就是寄在这一步复杂度分析上。
所以你会发现这 USACO 铂金组就这???
锐评:只会 T2,但是 T1 \*2600, T2 \*2100, T3 \*2200 。
3. CF1770E Koxia and Tree
difficulty - 2400
Div1.5 不会 E ,警钟长鸣。
考虑不移动的情况,计算每条边的贡献,
$$preans = \frac{2}{k(k-1)} \sum_{x}(k-siz_x)siz_x$$
$siz_x$ 表示 $x$ 子树内的蝴蝶个数。
性质:每条边上最多只会有一只蝴蝶经过,所以每颗子树大小的可能性至多 $3$ 种;又蝴蝶的相对位置关系不会发生变化。
那么不妨直接计算每条边上的移动在 $preans$ 基础上的贡献。为此我们只需要求出每条边上发生某种方向移动的分别的概率就可以了。
设 $f_x$ 表示在此时刻点 $x$ 上有蝴蝶的概率,按顺序遍历每条边 $(u,v)$ 显然只有 $f_u$ 和 $f_v$ 可能发生变化。可以列出式子:
$$f_u=\frac{1}{2}f_uf_v+\frac{1}{2}(f_v(1-f_u)+f_u)=\frac{1}{2}(f_u+f_v)$$
$$f_v=\frac{1}{2}f_vf_u+\frac{1}{2}(f_u(1-f_v)+f_v)=\frac{1}{2}(f_v+f_u)$$
每次处理一条边对 $f_x$ 的贡献之前,用前面算好的 $f_x$ 计算边上发生某种方向移动的分别的概率,就做完了。
为了方便起见,我们先忽略 $\frac{2}{k(k-1)}$ ,即始终求的是所有蝴蝶两两距离之和,最后再乘以 $\frac{2}{k(k-1)}$ 。
-
总结:
-
树上点两两距离之和拆边的贡献计算。
-
调整法:最终形态基本固定,先求出大致答案,再进一步拆贡献调整。
4. CF1367F2 Flying Sort (Hard Version)
difficulty - 2400
典中典 $\text{div3}$ 的题不会做。
考虑没有移动过的数字,它们在值域上形成连续段。这个连续段上,除了两端的数字,其他必须包括这个数字的全部出现,形成若干条线段。
那么对于平凡情况,我们双指针 $+$ 线段树维护中间完全的连续段,每次二分两边最多能取的数字即可。
非平凡情况:讨论只有一种数字和两种数字的情况。均 trivial。
5. CF1622F Quadratic Set
difficulty - 2900
看到 HASH 的标签就去看了题解,亏了一道紫题。这题好好思考还是能做出来的。
当 $n$ 为偶数的时候,考虑全选的乘积。设 $n=2k$ 。
$$M=\prod_{i=1}^{2k}i!=\prod_{i=1}^{k}(2i-1)^2(2i)=(\prod_{i=1}^{k}(2i-1))^22^kk!$$
当 $n=4t$ 可扔掉 $2t$ 。
当 $n=4t+2$ 可扔掉 $2t+1$ 和 $2$ 。
说明 $n$ 为偶数时答案至少为 $n-2$ 。
又 $n$ 为奇数时可忽略 $n$ 而直接使用 $n-1$ 的答案,所以对任意 $n$,答案至少为 $n-3$ 。$n$ 为奇数时 $n-3$ 的答案可以通过扔掉 $2,\lfloor \frac{n}{2}\rfloor,n$ 得到。
考虑判断答案能否为 $n,n-1,n-2$ 。一个选中的集合合法的条件是什么?乘积中每个质数的次数均为偶数次。可以想到异或 HASH。
给每个质数随机分配一个权值,用线性筛求出每个 $i!$ 中每个质数权值的异或和(有几次就异或几次),再根据情况枚举即可。复杂度关于 $n$ 线性对数。
6. CF19D Points
difficulty - 2500
$\log^2 \text{to} \log n$ 解决方案:对于每个横坐标用 $\text{std::set}$ 维护 $\text{y}$ 的最大值 $P_x$,再用线段树维护 $P_x$ 在区间上的最大值,线段树二分找出每个第一个 $P_x>y_0$ 的 $x$,再在 $x$ 对应的 $\text{std::set}$ 上找后继即可。
7. CF1767F Two Subtrees
difficulty - 3100
很 edu 的一道好题,我直接不会。
看完题应该就能想到把树拍平为 $\text{dfs}$ 序然后四维莫队 $\mathcal{O}(n^{7/4})$,但这样的话这题就太无聊了,而且以我的常数估计过不了。
注意到一件事:把树拍平的过程会损失很多性质,比如区间不相交,总共只有 $n$ 种区间等等。而有一个科技叫做子树莫队,专门解决子树问题(注意不是树上莫队)。它的操作原理是这样的:把重儿子放在最前遍历求 $\text{dfs}$ 序,一个表示子树的区间 $[dfn_x,dfn_x+siz_x-1]$ 按照如下方式移动:
1. 移动前后的子树有祖先后代关系,则扩展/收缩两个端点;
2. 否则直接删去前一个区间,加上后一个区间。
- 我们可以证明,在此操作下,从一整棵树的头到尾两端点移动次数为 $\mathcal{O}(n\log n)$。
一个子树,如果其连向父节点的边为重边,则其为重子树。反之亦然。
第一种移动:本质上是删去所有轻子树,每个点在轻子树中出现次数最多 $\mathcal{O}(\log n)$ 次(经典结论),所以总贡献为 $\mathcal{O}(n\log n)$。
第二种移动:新移动到的必然是一个轻子树,同第一种算法,总贡献为 $\mathcal{O}(n\log n)$。
$\text{Q.E.D.}$
所以我们可以把按照 $\text{dfs}$ 序排好的点列看作长度为 $n\log n$ 的序列,四维莫队回到二维莫队,$q$ 次询问求众数,则取块长为 $n\log n/{\sqrt q}$,值域分块即可。
- 值域分块的操作:把颜色按照值域分块,记录每个颜色出现次数 \(buc_i\),记录每个块中每个“颜色出现次数”的出现次数 \(cnt_i\),记录当前众数的出现次数 \(mx_i\),移动端点时暴力移动 \(mx_i\),由于 \(mx_i\) 改变至多为 \(1\),单次 \(\mathcal{O}(1)\);求答案时,求出所有 \(mx_i\) 最大值 \(m\),再找到第一个 \(mx_i=m\) 的 \(i\),在此块内暴力查找颜色即可,单次 \(\mathcal{O}(\sqrt a)\)。
总时间复杂度:\(\mathcal{O}(n\sqrt q \log n+q\sqrt a)\)。
8. CF1774G Segment Covering
difficulty - 3200
太难了。
先上一个简单的结论吧:如果一个线段包含了另一个线段,则这个长的线段可以直接扔掉。为什么?因为任何一种包含了长线段的方案,短线段有没有都是无所谓的,对奇偶的贡献均为 \(1\)。
9. CF1762E Tree Sum
difficulty - 2600
首先记住一个知识点:
- \(n\) 个顶点有标号无根树的数量为 \(n^{n-2}\);
- \(n\) 个顶点有标号有根树的数量为 \(n^{n-1}\)。
为什么?学习一下无根树的 \(\text{prufer}\) 序列。
考虑一个树 \(T\),每次删去树中标号最小的叶子结点并将其相连的结点的编号 \(x\) 写入 \(\text{prufer}\) 序列中,直到树中只剩余两个结点。
显然任意一棵树对应唯一 \(\text{prufer}\) 序列,而 \(\text{prufer}\) 序列的数量是 \(n^{n-2}\)。接下来我们(感性)证明任意一个 \(\text{prufer}\) 序列能够唯一还原一棵树 \(T\)。
- 设可重集合 \(G=\{p_1,p_2,...p_{n-2}\}\);第 \(i\) 次操作,设 \(x=\text{mex}(G)\) 且满足 \(x\) 首次出现,连边 \((x,p_i)\) 并删去 \(G\) 中的 \(p_i\)。最后在未出现过的结点 \(x,y\) 之间连一条边。
回到 CF1762E 中。我们拆边的贡献。断开要计算贡献的边之后,设 \(1\) 所在连通块大小为 \(i\),\(n\) 所在连通块大小为 \(n-i\)。两边各选出一个点 \(x,y\) 连边 \((x,y)\),权值应该为 \((-1)^{i}=(-1)^{n-i}\)。可以剥叶子或整体法证明。
所以 \(n\) 为奇数时答案直接为 \(0\)。\(n\) 为偶数时,在 \(1\) 所在连通块再给它分配 \((i-1)\) 个点,方案数 \(\begin{pmatrix}n-2\\i-1\end{pmatrix}\)。两边各生成一个有根树并以两树的根的连边作为要计算贡献的边,方案数 \(i^{i-1}(n-i)^{n-i-1}\)。
于是,总答案为:(\(n\) 为偶数)
10. CF1188B Count Pairs
difficulty - 2100
problem link
code
文化课白学了。
\((a_i+a_j)({a_i}^2+{a_j}^2)\equiv k \mod p\)
这个式子完全没法做,而且 div1B 应该不可能有数论的高科技。
考虑参数变量分离。两边同时乘以 \(({a_i}-{a_j})\) (注意,题目保证 \(a_i\) 两两不等,且 \(p\) 为质数我们才能这样做,否则该操作逆不回去):
\({a_i}^4-ka_i \equiv {a_j}^4-ka_j\) 开个桶做一下就可以了。
时间复杂度 \(\mathcal{O}(n \log n)\)。