时间安排
7:30–7:35 读题,今天题目非常神仙。
7:35–8:30 T1,显然要 DP 。直接维护集合显然不可能,考虑能否维护当前集合有几个元素,但这样基本做不了。又想到建虚树什么,反正非常假。
8:30–9:00 T1 暴力。
9:00–9:30 T2,尝试写了一下暴力最小割,挂了,非常自闭,感觉这个最小割非常复杂就把T2弃了。
9:30–10:30 T3,目测可以DP,将每个元素的数量看作物品,当 c n t ≤ 2 cnt \leq 2 cnt≤2 时,物品之间的关系可以背包 DP。打表发现了很多规律,需要一堆分类讨论,于是就奔着特殊点做,发现只会 n 3 n^3 n3 过不了,貌似可以硬上FFT 变成 n 2 l o g n^2log n2log 但是常数巨大巨麻烦。
10:30–11:00 T3,思考背包怎么优化。
11:00–12:00 T1,思考怎么 DP。
回顾&反思
T1: 是一道套路题,关键要交换求和符号,实际上时分解贡献,将所有集合大小的求和问题变为枚举元素考虑它在多少集合出现,然后套路容斥。一个经典但是有用的 trick 是,当指数 k k k 较小时,在求解 x k x^k xk 这样的贡献时可以考虑用斯特林数拆掉指数。对于有若干元素存在的问题,可以枚举有几个不存在,容斥。
T2: 比赛的时候完全没有把最小割和树结合起来,看了几眼觉得复杂就跳了,非常可惜。仔细观察可以发现可以将答案拆成子树贡献的形式,用树上 dfs 边走边合并信息做就可以了。一个减少空间的 trick 是,当要用树剖和线段树合并维护信息时,可以令一条重链上的点共用一个线段树,即最下面的点建树,上面的点借用该树,轻儿子合并时将处理过信息且不作为树上结点的点直接回收,这样空间复杂度是 n l o g nlog nlog 。
T3:结论和比赛时推的结论一模一样,不过 std DP写的貌似更妙。待 upding …