18
两棵树无法被区分,当且仅当两棵树「 一个点到根的路径上的所有点的子树大小构成的集合」构成的集合相同。
设 \(dp_{i,j}\) 表示 \(j\) 棵大小为 \(i\) 的树(不区分顺序)的方案数。那么
转移的时候得先枚举 \(x\),再枚举 \(j\),这是为了保证不算重。
https://www.luogu.com.cn/problem/P8959
考虑给出的如果是一棵内向树该怎么做。把操作离线下来,在每个点上维护一棵时间轴线段树,支持后缀加、前缀求区间 \(\max\)、合并两棵线段树。直接做就可以了,复杂度是 \(O(n\log n)\) 的。
其实直接在有向树上套用上面这个做法,复杂度还是 \(O(n\log n)\) 的。这是因为执行 \(x\rightarrow y,x\rightarrow z\) 两次合并肯定不劣于 \(x\rightarrow y,y\rightarrow z\) 两次合并,而不断把 \(x\rightarrow y,x\rightarrow z\) 变成 \(x\rightarrow y,y\rightarrow z\) 直到无法操作后,有向树就会变成内向树。
http://xsy.gdgzez.com.cn/JudgeOnline/problem.php?cid=2375&pid=2
考虑在每一对 \((2i-1,2i)\) 之间连上一条虚边,那么整个图会形成若干个链和环。dp 出 \(f_S\) 表示 \(S\) 这个集合形成一个链或环的所有方案的权值和,然后要对 \(f\) 做一个在线的子集卷积。先枚举最高位 \(k\),然后做长度为 \(2^k\) 的子集卷积,这样做 \(n\) 次卷积的复杂度还是 \(O(2^nn^2)\) 的。
https://www.luogu.com.cn/problem/P10353
考虑如果两个数 \(i,j\) 在经过一次置换后变成了 \(i'\) 和 \(j'\),那么 \(p_i<p_j\) 的概率和 \(p_{i'}<p_{j'}\) 的概率应该是相同的。所以把每一对这样的 \(((i,j),(i',j'))\) 缩在一个等价类里,如果一个等价类内有 \(x\) 个满足 \(i<j\),\(y\) 个满足 \(i>j\),那么它对答案的贡献就是 \(\frac{xy}{x+y}\)。这是因为每一对 \(i<j\) 都有 \(\frac{y}{x+y}\) 的概率被置换成 \(i>j\)。
复杂度的瓶颈在于缩等价类,这一步是 \(O(n^3)\) 的。考虑构造出更少的排列,使得这些排列的置换群和原置换群相等。用以下方式构造 \(k\) 个排列:对题目给出的每一个排列,都以 \(\frac{1}{2}\) 的概率选择,把所有选出的排列复合起来。\(k\) 取 \(50\) 就能基本保证正确了,虽然我不会证。
https://www.luogu.com.cn/problem/P10547
交换的最小代价即为 \(\sum_{i<p_i}(p_i-i)\);排列合法等价于置换环数量为偶数。做连续段 \(dp\),设 \(dp_{i,j,k,0/1}\) 表示前 \(i\) 个数形成了 \(j\) 条链,代价总和为 \(k\),置换环数量为奇数/偶数的方案数。注意到这个 \(j\le\sqrt k\),所以复杂度是 \(O(nm\sqrt m)\) 的。
https://www.luogu.com.cn/problem/P8991
考虑什么样的区间是一定不优的。如果 \([l,r]\) 可以被劈成两半,使得一半的区间和是正数,另一半的区间和是负数,那它就是没有用的。这等价于,在 \(s_{l-1},s_l,\dots,s_r\) 中,\(s_{l-1}\) 和 \(s_{r}\) 一个是最小值,一个是最大值。打个表发现这样的区间数量不多,然后就做完了。

浙公网安备 33010602011771号