题意
有一棵树,大小为,树上每条边都有边权,可以是1,可以是0。现有对。
定义一个准路径长度等于到之间的路径和mod 2。现在问边权值有多少种方案让序列满足非递减( , )。
答案需要对取模。
分值 | 限制 | 子任务依赖 | |
---|---|---|---|
1 | 10 | ||
2 | 20 | 1 | |
3 | 70 | 2 |
题解
容易发现答案为把一段前缀设为(表示和相同),后面为(表示和不同),这样的合法种数(设最后一个的位置为,合法种数即个数),问题在于如何求出合法种数。
暴力的做法是一条条连边,用并查集维护每个点与祖先是否相同,连边的同时判断合法性。原本一直在想一条条把的边换为的边,但这样需要撤销一条之前的边再连上一条新边,对并查集的影响难以维护。
发现上面的问题在于并查集仅能支持撤回刚加入的边,而不能撤回之前的边。对于直接从左往右考虑不好做的问题,应该考虑分治:对于当前区间,先把左半部分全部设为,向右递归计算(即在右半边)后撤回,然后把右半部分全部设为(即在左半边),向左递归计算后撤回。由于这样保证撤回的都是刚加入的边,用启发式合并维护并查集回退即可,效率。