CF1442

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

咕咕咕。

原文地址:https://www.cnblogs.com/Soulist/p/13924183.html