8月做题记录
感觉再不写做题记录会废的
这个博客用惯了,懒得再用原来那个写了
Latex不是很会,应该会比较乱
- CF1995D
首先可以转化一下题意,变成先选出一个字符集(必须包含字符串的最后一个字母),使得字符集里的字母在字符串中的位置前后相差不超过k,询问字符集的大小最小为多少
加上字符集<=18,这个时候应该能想到跟二进制枚举相关。但枚举符合条件的情况复杂度要炸,于是我们考虑不符合条件的情况,即某一段连续k个字符都不在我们枚举的字符集中,这时这个字符集就是不合法的,那么对于每一段连续的k个字符我们都把它用二进制表示出来,记录到数组里面,表示同时没有这些字符的字符集是不合法的,接着我们在记录的数组里做一个高维前缀和,最后二进制枚举每一个没被标记的点,用ans对他们1的个数取min,这道题就做完了
- P3899
答案由两部分构成
-
b在a的上面,此时可以直接算: \(\min (K,depth[a]) \cdot size[a]\)
-
b在a的下面,每个点以dfn为root下标,dep为树内下标开一颗线段树(动态开点),遍历树的时候把它变成一个类似前缀和的东西,即dfn[u]的树以dfn[u]-1的树为基础在dep[u]的位置+(sz[u]-1),然后询问直接回答root[dfn[p]+size[p]-1]的树减去root[dfn[p]-1]的树在dep[p]+1到dep[p]+K上的贡献即可。
- P2824
分裂合并线段树,以值域作为树的下标,再用个set辅助一下就做完了
- AGC002D
Kruskal重构树
直接重构以后求lca,然后二分往上跳,由于有单调性所以是对的,然后就做完了
- P6018
给定一棵树,三种操作:
-
将一个点的相邻节点的值全部+1
-
单点-x
-
查询相邻节点值的异或和
看到异或容易想到trie
每个点开一个trie,但是trie上只需知道某一位上0,1的奇偶性即可,所以开 \(N*log*2\) 就够了,然后就是常规维护trie即可,只不过这里的父亲单独维护,儿子们一起维护