Duel 好玩:题目总结
然后最后呢 又得到了什么……
AT_abc318_f
假设知道了位置,我们可以贪心地判断。
现在只需要找到一些本质不同的位置即可。本质相同意思是这两个位置使用相同手臂可以到达宝藏区间是一样的。
直接钦定 \(i\) 手臂可以到达宝藏 \(j\),这样可以圈出一个区间,把平方个点全部拿出来排序过后两两相邻的位置间就是本质相同的位置。
我们只需要判断平方个位置即可,每次判断线性对数。
AT_agc012_b
很人机的题啊。听说有 xxs 做法是直接暴力 dfs 剪枝。
注意到 \(d\) 很小。但是每次暴力会被菊花图卡掉。
考虑一次传递,本质上是 \((x,d)\to (y,d-1)\)。这个状态可以刻画。
于是把询问作为初始化,跑 dp 即可。
P5093 AT_arc081_c
前面那个题只需要求答案。
显然每次选择一个刚好包含所有值域的段的最右边的点即可,可以用 set 维护。
后面要字典序最小,发现上述贪心直接死掉。
我们仍然希望每次选择的数字最小,并且选择该数字后不影响最终的长度。
可以用 dp 算出每个位置的后缀的长度,贪心时候判断可不可行即可。
AT_abc163_e
有一个很显然的思路是大的数尽量放两边。证明显然。
那么直接区间 dp 就做完了。当然为了方便实现可以从小到大决策 \(a\),这样始终是一个区间。
Duel 记录(10.29~30)
跳过人机题。
CF1209E2
和 Kares 开的 *2500,我们都不会。被 ddxrS 薄纱了。
让我们注意性质。每一行只与最大值是什么有关,其它列并不重要。所以决定性的列数就是最大值的贡献次数,是 \(O(n)\)。所以输入矩阵就变成了 \(12\times 12\)。
一看就是状压 dp。但是我们无法确定当前选择的这个数究竟是否真的是这一行的 max。考虑“错误” dp:每次钦定当前选的是/不是最大值。
虽然最大值可能被错算,但是容易发现错算后结果会变小,而正确计算的结果一定会被答案算到。这是一种很经典的 trick。
那么转移是简单的,枚举当前这一列有哪些行作为了行最大值,枚举子集转移即可。
CF28C
题目背景???
果然概率期望还是太菜了。
让我们把这个最大值记录在状态里面,然后 dp 计算方案数。
最后的答案就是每个最大值的方案数带权和,除以总共的方案数。
转移是简单的,在 \(x\) 个人里面选择 \(y\) 个的方案是 \(C_{x}^y\)。
CF238A
我一眼秒了,ddxrS 被秒了。
显然原序列和前缀和序列形成双射,就是要求异或前缀和互不相等即可。注意还不能是 0。由于值域是 2 的幂次,所以没有影响。
就相当于算在 \(2^m-1\) 个数中选择 \(n\) 个互不相同的数的方案数。做完了。
CF1042C
我被秒了,写得太屎了。
考虑讨论负数和 0 的个数。
如果有奇数个负数,那么我们一定要删除其中最小的那个。同时有 0 的情况不用管,因为如果你把 0 删了答案就是负数了。
否则我们通过操作把 0 删掉就可以了。注意实现。