山东省队集训整理

\(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))\)

posted @ 2020-09-21 22:55  evenbao  阅读(301)  评论(0编辑  收藏  举报