杂题选做 Part 2

UOJ280 题目难度提升

考虑没有数字相同的情况,这时不能加入比当前中位数小的值,否则肯定会使答案变小。

长度为奇数时,令$k$为大于当前中位数的最小值,则下一个加进去的数要在$[mid+1,2*k-mid]$间。如果这之间已经有数,那么直接填最大值。

长度为偶数时,如果$[mid+1,k]$之间已经有数填入,那么直接填最大值,否则填$k$

然后扩展到正解。

加入小于等于中位数的没有相同值可以用上述解法。

找到两个相同的且尽量大的值(即不能超过最终中位数),把它们作为开头,然后依次取大于小于的值使得中位数在这两个值之间反复横跳,直到小于等于它的值被选完。

这时剩下的全是比它大的值,怎么选都会比之前大,之前的条件就不用管了,而且不会再有小于中位数而且能反复横跳的数(都被取光了),所以直接执行算法1

AGC018D

对CF那道树上的构造题非常熟悉,也想到了对于每条边看上界,但是偏偏就忘记了重心这个事情。

假如这是一个哈密顿回路,那么每条边都可以取到理论最大值——在边两端反复横跳经过它的最大值,证明可以把路径拆分归纳证明。

而哈密顿路径,就会少一条起点到终点的路径的权值。

对于不是重心的点,它肯定有子树大于$n/2$,所以它上手往那边走,最终一定停在较大的那颗子树中,路径经过重心。

所以重心严格优于非重心。加入有两个重心,那么一定是它们之间的边,否则可以停在任意一个出点上——剩下的肯定能把这条边消耗到最大,选出边最小的即可。

AGC032D

延后操作,可以把题意转化成:提取出一些数,这些数可以扔到左边(代价B)或者右边(代价A),可以随意插入。

所以就可以$n^{2}$dp了:$dp[i][j]$表示到第$i$个,最后一个值为$j$,对于下一个数,可以不花代价直接扔到后面,也可以让它向前或者向后。

AGC028C

这种取$min$的路径构造对于每一个点入度出度考虑的题目也是AT经典呢。

考虑每一个点的入边和出边,假如这条边选的是这个点的属性,那么就在这个点的前面或者后面加上这一条边,最后的合法情况一定是:$n$个点连带每个点所带的边,组合起来一定是一个环。

所以有以下三种情况:全部选A,全部选B,至少有一个点入边出边都有,剩下的边选前$n-2$小的。

AGC021D

一个D题就考一个结论。

一个字串的最长回文子序列就是这个子串和它反转以后的串的最长公共子序列。

下面抽象地证明一下。

回文串肯定是LCS,现在只要证明不是回文串的公共串不是最优。

先首尾匹配直到两个界互相越过,回文串就是接下来两个指针依次匹配。

如果接下来还有不属于回文串的匹配,那么其中一个必定会多越过至少一个本已匹配的字母,否则它早先就被算进最长回文串了。

多加进去一个又至少删掉一个,答案不会变优。

接下来直接$n^{3}$dp即可。

ARC080F

补一波远古题的题解。

本质上是要找到一个更简单的、等价的操作。

先把数列进行异或的前缀和,目标是全部变成0,每一次操作相当于可以把一个1向左或向右

posted @ 2021-02-27 22:09  'Clovers'  阅读(84)  评论(0编辑  收藏  举报