随笔分类 - 算法-分治
摘要:分 b > d 和 b <= d 两种情况讨论。关于 b, d 做 cdq 分治。每次考虑右边对左边的贡献,这样 b, d 的大小关系就解决了。第一种情况比较简单,就是在可持久化 01 trie 里查询一下就行了第二种可以考虑每个 b 对 d 的贡献,方法就和第一种情况差不多了,也就是把“查询”改成“打标记”。
阅读全文
摘要:最少的操作次数显然是 n - 置换环的数量。操作对每个置换环是独立的,将它们的操作序列用组合数插到一起即可。考虑求一个环的方案数。设 dp[i] 表示长度为 i 的环的方案数。朴素 DP 是 n^2 的,可以用分治 FFT 优化。
阅读全文
摘要:一个结论是,不存在大小大于 2 的环。于是我们只需要保证图连通即可。从高到低考虑每一位,把数分成当前位为 0 的集合和当前位为 1 的集合,则为保证连通,必须有至少一个集合,大小小于 2。枚举删哪个集合,然后递归即可。本质是在 Trie 树上树形 DP。
阅读全文
摘要:把覆盖,转化成插入,由此可以得到一个O(n^2)的DP。观察DP转移,发现答案是一堆短多项式的乘积。一般做法是分治FFT,不过本题里可以用倍增+二项式定理去掉一个log。
阅读全文
摘要:如果只有一次询问,可以分治,每次考虑跨过中点的情况。预处理左半边后缀or和,右半边前缀or和,然后用two pointers求。发现前、后缀or和只会变化O(log a)次。用线段树维护,记录每个区间的答案,以及前、后缀or和(这O(log a)个段)。push_up和查询时,还用two pointers的方法合并左右区间。
阅读全文
摘要:每次把两个相邻、相等的字符删掉,判断一个串是否合法,就是看能不能删光。分治。只考虑要交换的两位置一个在[l,mid],一个在[mid+1,r]的情况。如果交换后合法,那么左、右两边分别操作后剩下的串应该是对称的。可以用哈希值来判断。枚举要交换的两个字符分别是什么。通过扫描+用栈维护,就可以求出左、右两边每个位置,在被修改后的哈希值。
阅读全文