cojs 疯狂的魔法树 疯狂的颜色序列 题解报告
疯狂的魔法树
一个各种操作大杂烩的鬼畜数据结构题目
首先我们注意到树的形态是半随机的
我们可以树分块,对树分成若干个块
对于每个块我们维护一个add标记表示增量
维护一个vis标记表示覆盖量
注意标记的下放和两个标记之间的处理
之后我们对于每个块我们排序,并维护块内的有序化
这样对于每个查询如果涉及到完整的块二分即可
否则暴力查询
这样时间复杂度是O(n*sqrt(n)*log(n))
疯狂的颜色序列
很古老的题目,如果去掉强制在线的话我已知的有五种不同的解法
第一种做法是莫队
第二种做法是离线将询问排序之后扫描线+树状数组
第三种做法是计算每个颜色上一次出现的位置,分块块内排序+二分
第四种做法是树套树,跟分块的原理差不多
第五种做法也就是我写的代码,我们计算每个颜色上一次出现的位置pre
那么每次询问等价于询问[L,R]有多少个点的pre值<L
之后就是可持久化线段树的裸题了