CF 1044 Div.2 解题报告
A(800)
题意:给定一个长度为 \(n\) 的数组 \(a\),问是否可以通过重新排列数组,使得 \(\prod \limits_{i=2}^n \frac{a_{i-1}}{a_i}=1\)。
这个题目看懂了就很幽默,直接判断是否存在两个相同的数。
B(800)
题意:有 \(n\) 个有点权 \(a\) 的点,你需要模拟构造生成树的过程,每一次选取两个点 \(i,j\),花费为 \(\max(a_i,a_j)\),连边 \((i,j)\),使两个点的点权都减小 \(\min(a_i,a_j)\),问最小花费。
认真想一下就会分析每一次操作后点权较小的点权值归零,之后我们只用权值为 \(0\) 的点进行操作即可。同时你会发现最大值越小越好,因此每次选取最小的还没有选取的两个点进行操作。
注意分类讨论长度为奇数的情况。
C(1400)
题意:有一个 \(n\) 个点的 DAG,你可以进行 \(2n\) 次询问,每一次询问可以给出一个点集和一个初始点,询问返回从初始点出发只走点集内点的最长距离。你需要输出原图中一个长度最长的路径。
长度最长的路径的长度是可以简单求的,你就令点集为全集,然后每一个点询问一次最长距离。
构造路径是难点。假如此时我们已经构造到了距离为 \(i\) 的点 \(p\),此时我们要找下一个点,那么这个点肯定是最长距离为 \(i-1\) 的,于是我们就询问 \(p\) 和每一个最长距离为 \(i-1\) 的点是否存在边(从最长距离较长点出发,点集为这两个点),存在边的话这条边就一定在最长路径中。(不然你那个 \(i-1\) 的最长距离哪来的)
D(1900)
题意:我表示很难翻译。
死亡分三种:
-
直接杀,花费为 \(h_i\);
-
只掉一个单位高度,花费为 \(h_i-1\);
-
从初始位置开始掉,花费为 \(h_i-\min(h_i,i-1)\),前提是上一个是直接杀的。
然后你就dp嘛。
E(2500)
题意:给定一颗 \(n\) 个点的树,树上有一个标记,初始在某一个未知点;你可以进行下述操作:
-
检查一个点是否为由标记,如果有,则直接获胜;否则标记随机沿着一条边移动(保证不会移动到刚询问到的点上)。
-
删除以一个点为端点的所有边。
请构造一个长度至多为 \(\lfloor\frac{5n}{4} \rfloor\) 的操作序列,使得无论标记得初始位置和移动方式如何变化,你都可以获胜。
树上问题先想链。链,那简单啊,从一段一直问到另一端就行了,次数为 \(n\)。
于是问题变成怎么在 \(\lfloor\frac{n}{4} \rfloor\) 次操作内将树变成若干条链。
然后你就根据儿子数量进行分类讨论即可。
同时,在这道题,构造操作序列是一门艺术。
F(3000)
题意:有一个长度为 \(n\) 的数组 \(a\)。你可以进行若干次操作:每次操作选择一个位置 \(i\),它可以覆盖 \([i-a_i+1,i+a_i-1]\) 的位置;同时一个位置如果被覆盖,那么它就不能被选择。请最小化操作次数使得所有位置都被覆盖。
柳高OIer特有的对线段树的敏感。首先,这个东西很像 CSP-S2025 T2。只不过有“被覆盖的不能被选”这个限制。然后你就分类讨论:如果存在覆盖,那么是谁覆盖谁。然后线段树优化dp即可。

浙公网安备 33010602011771号