ABC366简要题解
C
直接维护一个桶,表示每个元素当前的出现次数。
再利用这个桶直接维护答案即可。
D
三维前缀和模板题。
E
注意到答案中只会出现 \(O(n)\) 个不同 \(x\),以及 \(O(n)\) 个不同的 \(y\)。
于是单独考虑 \(x\) 和 \(y\),最后尺取求一下答案即可。
F
首先我第一个尝试的思路是贪心,但是很显然没法贪。
如果没法贪心,看起来就只能是 \(\text{DP}\) 了。
但是直接线性 \(\text{DP}\) 也没法做,因为你选择一些数对的顺序影响着你的答案。
于是我们希望能有一个合理的顺序——考虑排序。
注意到一个经典的思路就是,我们对于一种最终选择的顺序方案,调换其中相邻的两个数不会对其前面和后面的贡献产生影响,只会对这两个位置的值产生影响。于是我们比较优先级的时候就按照这两个数谁在前面更优来决定。
同时既然我们要拿来排序,就必须要证明出大小关系的传递性。这是我们最初的 \(\text{Cmp}\) 函数判定式:
移项,两边同除以 \(B_iB_j\) 得:
容易发现,现在的式子只与 \(i\) 本身有关,具有传递性。
于是我们就可以开始 \(\text{DP}\) 了。
第一个思路就是,设 \(f_{i, j}\) 表示考虑了前 \(i\) 个数,第 \(i\) 个数必选的情况下选 \(k\) 个。
但是数组的值应该表示什么呢?注意到有两个东西要维护,一个是前面的 \(\prod_{l=1}^{j} A_{p_l}\),另一个是 \(\sum_{l=1}^j B_l(\prod_{t=1}^{l-1}A_t)\)。
面对这种要同时维护两个信息的 \(\text{DP}\),常见的有以下几种做法:
- 两个维度中有优先级,比如优先比较第一个。
- 每次从 \(f_i\) 转移到 \(f_{i+1}\) 的时候只会修改少量的元素,这样的话可以直接用数据结构维护一下。
但显然这题不是,因为当前的第 \(i\) 个位置可能从之前的很多位置产生转移,得到我们无法排出的答案。
照这样看,我们的这条思路已经在这堵死了。考虑为什么无法转移呢,换句话说就是 \(\text{DP}\) 具有后效性。
既然是“后效性”,那么我们正难则反不就行了?于是我们考虑倒着维护 \(f_{i,j}\) 表示,考虑了第 \(i+1\) 到 \(n\) 的数对,选择了 \(j\) 个的最大权值,直接转移即可。
G
根据定义,每个点都会对它的相邻点集产生一个限制,这些限制之间是杂乱无章的。
我们希望能通过发现一些性质来简化题目,但是很不巧,这道题不行。
所以我们只能通过枚举来解决。但是一次性枚举所有点显然不行,而它给的图又是一般图,没有良好的性质。所以考虑逐个枚举。
问题在于这些点之间可能会有错综复杂的关系,我们直接逐个枚举会产生问题。
所以考虑用一种方式对问题进行等价的转换,使得问题具有更好的性质。根据题目,又有 \(N\leq 60\),这个数据范围启发我们用 \(\text{unsigned long long}\) 来存下每个点的连边。而我们可以使用线性基来消元,使得这些限制变成一个上三角矩阵。
考虑上三角矩阵的最后一行开始逐个给点赋权。先考虑所有具有着限制的点,我们希望除了当前这个点之外其他点的权值异或起来 \(>0\),因为这样第 \(i\) 号点的权值才能 \(>0\)。
而有限制的点的权值又是由一些最初的无限制点的权之前决定的。所以说我们考率要怎样给无限制点赋权使得某些他们的组合异或起来不为 \(0\)。
显然有个东西叫异或哈希(就是给无限制点随机赋权)。
然后问题就得以解决。