CF1442

CF1442

A

给定长度为 \(n\) 的数列 \(\{a\}\),你可以执行两个操作:

  • 选择一个前缀并减 \(1\)
  • 选择一个后缀并减 \(1\)

你需要使得 \(a\) 变成 \(0\),判断能否完成。

\(n\le 3\cdot 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\) 取模。

\(n\le 2\cdot 10^5\)

Solution

反向考虑操作,从后往前加入元素,不难看出来假设 \(x\) 被加入了,那么两端的可以被删除的一定还没有加入,答案就是两端还没被加入的元素数量和的乘积。

同时这是充要的(可以手玩一下)。

复杂度 \(\mathcal O(n)\)


C

给定一张有向图 \(G\),你需要从 \(1\) 走到 \(n\),每次你可以:

  • 经过一条边,花费 \(1\)
  • 反转一条边,假设这是当前翻转的第 \(k\) 条边,那么花费为 \(2^{k-1}\)

求最小花费,答案需要取模输出。

Solution

两遍最短路,先考虑分层图,计算从 \(1\to x\) 经过了 \(k\) 次翻转的最短路。

显然 \(k\) 较大的时候答案只关乎 \(k\),维护一个双关键字的最短路即可。这里跑 Dij,复杂度 \(\mathcal O(n\log n)\)


D

给定 \(n,k\) 表示有 \(n\) 个数列,每个数列的元素都是单增的,你可以执行以下操作 \(k\) 次:

  • 选择一个非空数列的开头元素,然后获得其权值,删除其。

求你能获得的最大权值。

\(n,k\le 3000,\sum |S|\le 10^6\)

Solution

观察:我们最后的选择方案中,不存在两个序列是部分被选择。

因为这样调整为全选显然更优。

于是只有一个序列是部分选择,考虑计算除去其之外,其余序列均全选/全不选的情况下的最优解。

这玩意儿显然是一个 dp 模型,可以通过分治优化,复杂度为 \(\mathcal O(nk\log n)\)


E

给定一棵树,点有黑色/白色/灰色三种颜色,每次你可以选择一个连通块然后选择一些点删除,删除这些点之后你会删除他们的出边。

你不能在一次操作同时删除白色点和黑色点,求最小操作次数。

\(n\le 2\cdot 10^5\),多组数据。

Solution

观察:删除某个灰色点一定是和某个黑色点/白色点一起删,此时可以确定它的颜色,问题等价于先给灰色点染色再求解答案。

对于一棵仅由黑色/白色点构成的树,可以考虑将黑色连通块和白色连通块缩起来,此时考虑这棵黑/白相见的树,其答案不超过当前深度。

同时,任意的根节点都可以导致不同的答案,显然根节点取直径中点时最优,为 \(\frac{直径}{2}+1\)(当然我并不会证这个是下界,这是猜的)

于是只需要计算给灰色点染色后的直径长度的最小值。

观察:灰色点对答案没有影响。

根据转换,灰色点会使得答案更劣,但是显然灰色点不会使得答案更劣,所以灰色点没有影响。(但是灰色点可以使得图的结构改变,类似于虚点的感觉)

例外:所有点都是灰色点。

但是答案加了 \(1\) 刚好判掉了。。。

  • 话说我发现灰色点这个 detail 处理起来挺恶心的...

F

咕咕咕。

posted @ 2020-11-04 09:13  Soulist  阅读(235)  评论(0编辑  收藏  举报