CF1442
A
给定长度为 (n) 的数列 ({a}),你可以执行两个操作:
- 选择一个前缀并减 (1)
- 选择一个后缀并减 (1)
你需要使得 (a) 变成 (0),判断能否完成。
(nle 3cdot 10^4)
Solution
等价于将每个元素拆成两个部分 (p_i,q_i) 使得 (p_i+q_i=0),(p_i) 单调减,(q_i) 单调增。
于是可以直接贪心,在保证 (q_i) 单调增的前提下尽可能的最大化 (p_i)(注意 (p_i) 应满足小于等于 (p_{i-1})
B
给定一个数列 (a),你可以执行以下操作:
- 选择一个 (x) 然后将它左边或者右边的一个元素删除。(前提为有)
将被每次被选择的元素记录下来,可以得到一个序列 (b),将每次被删除的元素记录下来,可以得到一个序列 (c),我们给定 (b) 与 (a),你需要求有多少个序列 (c) 可以由给定 (a,b) 生成。
答案对 (998244353) 取模。
(nle 2cdot 10^5)
Solution
反向考虑操作,从后往前加入元素,不难看出来假设 (x) 被加入了,那么两端的可以被删除的一定还没有加入,答案就是两端还没被加入的元素数量和的乘积。
同时这是充要的(可以手玩一下)。
复杂度 (mathcal O(n))
C
给定一张有向图 (G),你需要从 (1) 走到 (n),每次你可以:
- 经过一条边,花费 (1)
- 反转一条边,假设这是当前翻转的第 (k) 条边,那么花费为 (2^{k-1})
求最小花费,答案需要取模输出。
Solution
两遍最短路,先考虑分层图,计算从 (1 o x) 经过了 (k) 次翻转的最短路。
显然 (k) 较大的时候答案只关乎 (k),维护一个双关键字的最短路即可。这里跑 Dij,复杂度 (mathcal O(nlog n))
D
给定 (n,k) 表示有 (n) 个数列,每个数列的元素都是单增的,你可以执行以下操作 (k) 次:
- 选择一个非空数列的开头元素,然后获得其权值,删除其。
求你能获得的最大权值。
(n,kle 3000,sum |S|le 10^6)
Solution
观察:我们最后的选择方案中,不存在两个序列是部分被选择。
因为这样调整为全选显然更优。
于是只有一个序列是部分选择,考虑计算除去其之外,其余序列均全选/全不选的情况下的最优解。
这玩意儿显然是一个 dp 模型,可以通过分治优化,复杂度为 (mathcal O(nklog n))
E
给定一棵树,点有黑色/白色/灰色三种颜色,每次你可以选择一个连通块然后选择一些点删除,删除这些点之后你会删除他们的出边。
你不能在一次操作同时删除白色点和黑色点,求最小操作次数。
(nle 2cdot 10^5),多组数据。
Solution
观察:删除某个灰色点一定是和某个黑色点/白色点一起删,此时可以确定它的颜色,问题等价于先给灰色点染色再求解答案。
对于一棵仅由黑色/白色点构成的树,可以考虑将黑色连通块和白色连通块缩起来,此时考虑这棵黑/白相见的树,其答案不超过当前深度。
同时,任意的根节点都可以导致不同的答案,显然根节点取直径中点时最优,为 (frac{直径}{2}+1)(当然我并不会证这个是下界,这是猜的)
于是只需要计算给灰色点染色后的直径长度的最小值。
观察:灰色点对答案没有影响。
根据转换,灰色点会使得答案更劣,但是显然灰色点不会使得答案更劣,所以灰色点没有影响。(但是灰色点可以使得图的结构改变,类似于虚点的感觉)
例外:所有点都是灰色点。
但是答案加了 (1) 刚好判掉了。。。
- 话说我发现灰色点这个 detail 处理起来挺恶心的...
F
咕咕咕。