Codeforces 1574
题目传送门:Codeforces 1574
D The Strongest Build
首先肯定是贪心地想尽量取最大的集合,考虑将当前最大的压入队列,利用\(BFS\)加入候选的集合,用优先队列维护,每次取出最大的即可。
由于\(m\le 10^5\),所以被遍历的状态一定\(\le 10^5\)个,而每一种状态最多可以加入\(n\)个候选集合进队列(就是对应每一数组的位置\(-1\)),所以总状态数不会超过\(10^6\),显然是可以接受的,复杂度\(\mathcal O(nm\log(nm))\)。
Submission
E Coloring
对于给定的一个矩阵,我们考虑它什么时候是合法的。发现要么矩阵的每一行都恰好等于上一行取反,要么矩阵的每一列都恰好等于上一列取反。所以对于一个尚未确定的矩阵,我们可以分别对行和列的方案计数。
具体来说,考虑行(列类似),如果某一点的状态确定,那么所有行的这一列的状态就都是确定的了,而对于没有任何一行状态确定的列,此列就有2种填法满足每一行都恰好等于上一行取反。所以,要么有的列状态出现冲突,方案数为0,要么方案数就是\(2^{\text{未确定的列数}}\),发现这一过程用\(\text{set}\)维护即可。而对于一个行和列都满足等于上一行和列取反的矩阵,在行和列中都会被算到,要减去重复,实际上这样的矩阵最多只有2个。
Submission
F Occurrences
分析性质好题!
首先考虑等价转化题目中的条件:对于\(x\in A_i\)出现在了\(a\)中,那么\(a\)中\(x\)的下一个元素必定是\(A_i\)中\(x\)的下一个元素,且\(a\)中\(x\)的上一个元素必定是\(A_{i,j-1}\),且对于所有数组都满足。
由此想到建图(建图的方法还总是想不到):对一个\(k\)个点的图连边,\(A_{i,j}\rightarrow A_{i,j+1}\),对所有数组都这样连边,再删去重边。基于上面的分析,再对这个图进行分析。考虑如果选了一个点,那么必须要选必须要选它连向的点,且上一个元素一定是指向它的点,所以如果一个点的出度或入度\(\ge 2\),那么这个点所在的弱连通图都是不能选的。而且如果成环的也不能选,因为数组\(a\)的长度是有限的。由此发现每次一定是选一条链加入数组\(a\)。
记这些链的长度分别是\(len_j\),那么可以写出\(DP\)方程:\(dp_i=\sum_{j=1}^{cnt}dp_{i-len_j}\),复杂度是\(\mathcal O(mn)\)。
考虑换一种\(DP\)方式,记长度为\(j\)的链有\(cnt_j\)个,则\(dp_i=\sum_{j=1}^{k}dp_{i-j}cnt_j\),复杂度是\(\mathcal O(mk)\)的,依旧过不去。然而不同长度的链的个数只有\(\mathcal O(\sqrt k)\)个,所以复杂度可以降到\(\mathcal O(m\sqrt k)\)。
考虑证明不同长度的链的个数只有\(\mathcal O(\sqrt k)\)个:若链的长度\(\le \sqrt k\),显然种类\(\le \sqrt k\)种;若链的长度\(>\sqrt k\),那么这样的链不会超过\(\sqrt k\)个,所以得证。
Submission

浙公网安备 33010602011771号