山东省队集训整理

(LOJ6059)

首先考虑一个数位 (DP) 的思路。(f_{i , j , k}) 表示前 (i) 位 , 模 (p) 的值为 (j) , 每位之和为 (k) 的方案数。
发现 (n) 很大 , 那么倍增优化即可。
时间复杂度 : (O(mplogmlogn))

(LOJ6060)
记整个集合的异或和为 (S)
对于 (S) 中为 (0) 的位 , 我们希望其在两个集合中都是 (1) , 而对于 (S) 中为 (1) 的位就不需要考虑了 , 但按照题目中所说的 , 要使第 (1) 个集合的异或和尽可能小。
因此将为 (0) 的位从大到小放在前面 , 为 (1) 的位从大到小放在后面 , 插入线性基即可。
时间复杂度 : (O(NlogN))

(LOJ6062)
考虑霍尔定理 , 线段树维护即可。
时间复杂度 : (O(NlogN))

(LOJ6066)
首先二分答案。
将树写成括号序列后用可持久化线段树维护哈希值。 并使用平衡树记录哈希值的集合。
时间复杂度 : (O(Nlog^2N))

(LOJ6068)
考虑行联通块对列联通块连边 , 这样建出了一个二分图模型。
将行 / 列的边权定义为差分值 ({i(i + 1)} over {2}) - ({i(i-1)} over {2}) = (i)
直接运行费用流即可。
时间复杂度 : (O(CostFlow(N ^ 2 , N ^ 2)))

(LOJ6066)
首先得到一个排列 (P) , 设 (S = sum{max(P_{i - 1} , P_{i})}) , 那么 (S + 1) 就是紧密排列起来的长度。
还剩下的 (l - (S + 1)) 个格子 , 将其插入在剩余的空位中 , 其方案数为 ({l - S - 1 + n choose n})
因此要求的是 (S = k) 的方案数。
这是个经典问题 , 设 (dp_{i , j , k}) 表示前 (i) 个数 , 整个序列分为 (j) 个联通块 , 排列总长度为 (k) 的方案数。 直接转移即可。
现在问题转化为求 ({L choose 0..n}) , 注意到 (L) 很大 , 但 (n) 很小 , 因此矩阵快速幂即可。
时间复杂度 : (O(N ^ 3logL))

(LOJ6072)
生成树计数 , 二项式反演 , 折半搜索。
具体不赘述了。 时间复杂度 : (O(2 ^ N(n+m)))

原文地址:https://www.cnblogs.com/evenbao/p/13709284.html