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
咕咕咕。