做题记录

CF1671E

注意到不同子树间的答案独立。那么对于 \(u\) 为根的子树,其贡献应该是其左儿子乘右儿子再乘它自己的方案。那么由于它自己的方案只与 \(f(l),f(r)\) 有关,所以当其操作后能使答案贡献增加,当且仅当 \(f(l) \ne f(r)\)。为了排除儿子自身的影响,我们将 \(f(x)\) 视为 \(x\) 为根子树中遍历得到字典序最小的序列。那么只要 \(f(l) \ne f(r)\)\(u\) 就会对答案贡献 \(2\) 倍,因为可以不交换。时间复杂度 \(O(n 2^n)\)

CF1485F

考虑暴力 DP。定义状态函数 \(f_{i,j}\) 表示前 \(i\) 个数,\(\sum\limits_{k=1}^{i} a_k =j\) 时的方案数。对于情况 \(1\),我们有:\(f_{i,j}=f_{i-1,j-b_i}\)。对于情况 \(2\),我们有:\(f_{i,b_i}=\sum\limits_{j=-V}^{V} f_{i-1,b_i-j}\)。其中 \(V\) 为值域,我们可以将 \(V\) 视作 \(\inf\)。那么有:\(f_{i,b_i}=\sum\limits_{j=-V}^{V} f_{i-1,j}\)

整理一下,有:\(f_{i,j+b_i}=f_{i-1,j},f_{i,b_i}=\sum\limits_{j=-V}^{V} f_{i-1,j}\)。不难发现,我们每次相当于将第二维同时增加了 \(b_i\),而后面是个全局 \(sum\)。这里有个很典的 trick,我们记录 \(tag\) 表示整体右移的大小。那么这次转移较初始状态右移了 \(tag=\sum\limits_{j=1}^{i} b_j\)。我们还原到初始状态,就有:\(f_{i,j}=f_{i-1,j},f_{i,b_i-tag}=sum\)。记 \(s_i=\sum\limits_{j=1}^{i} b_j\),有:\(f_{i,-s_{i-1}}=sum\)。然后就做完了,由于第一个转移相当于直接赋值,所以只需要维护 \(f_{i,-s_{i-1}}=sum\),记录全局 \(sum\) 即可。答案也为全局 \(sum\)。时间复杂度 \(O(n \log n)\)

CF1582F1/F2

对于 F1,我们定义状态函数 \(f_{i,j}\) 表示前 \(i\) 个数,异或和为 \(j\) 时最小的结尾。那么能做到 \(O(nV)\)

观察 \(f_{i,j}\) 维护出的结果,我们发现。当 \(f_{i,j}=x\),且 \(x\) 是在 \(i\) 时用 \(a_i\) 转移出来的。即 \(f_{i,j}=a_i\)。那么 \(k>i\)\(f_{k,j}\) 如果等于 \(a_i\) 那么选择的下标一定是 \(i\)。那么我们考虑定义 \(f_{i,j}\) 表示最大值不超过 \(i\) 时,异或和为 \(j\) 时结尾下标的最小值。那么就能做到 \(O(V^2)\) 了。

P3825

2-SAT 板子。

先考虑 \(d=0\) 的情况,那么对于第 \(i\) 场比赛,我们就只有两种选择。则现在问题转化为:对于每场比赛选两种情况中的一种,使得满足 \(m\) 条限制关系。然后这就是一个 2-SAT 问题,直接跑就行了。现在考虑 \(d >0\) 的情况,注意到我们 \(d \le 8\),考虑枚举每个 \(x\)\(a,b\) 还是 \(c\)。这样的时间复杂度是 \(O(3^d m)\) 的,会炸。但是当 \(x=a\) 时,这场能选的车为 \(B,C\),当 \(x=b\) 时,这场能选的车为 \(A,C\)。如果 \(x=a\)\(x=b\) 都无解,那么说明不管 \(x\)\(A,B\) 还是 \(C\) 都无解,所以 \(x=c\) 时一定无解。那么时间复杂度就变成 \(O(2^d m)\) 了。

posted @ 2025-01-10 10:52  harmis_yz  阅读(21)  评论(0)    收藏  举报