CF940F Machine Learning
莫队维护区间每个数字出现的次数,维护某个出现次数是否出现过,暴力枚举mex即可,易证每次枚举最多 n \sqrt n n次
CF375D Tree and Queries
树转链,莫队维护区间每个颜色出现的次数,如果再单纯维护次数为k的颜色有多少,最后枚举 1 − k 1-k 1−k,超时,所以直接维护次数 > = k >=k >=k的颜色有多少
P4074 [WC2013] 糖果公园
树转链,莫队维护区间,按题意计算新加一个点的贡献。但是发现询问是一条路径,是多个不同的区间合起来的答案,所以树转链用欧拉序列,维护每个点遍历到和回溯到的时间戳,然后将两点的路径转换为区间问题,如果一个点在区间中出现两次,说明不在路径上,贡献抵消。然后特判一下 l c a ( x , y ) lca(x,y) lca(x,y)是否与 x , y x,y x,y不重合,单独计算 l c a ( x , y ) lca(x,y) lca(x,y)的贡献
CF1514D Cut and Stick
如果整个序列中没有数超过 ⌈ n 2 ⌉ \lceil {n \over 2} \rceil ⌈2n⌉的数,不用划分序列
如果有,当且仅有一个,只需要把这个数用其他数尽可能放到一个序列中,再将这个数剩下的单独成一个序列即可
得出组数为 2 × m a x n − ( r − l + 1 ) 2 \times maxn-(r-l+1) 2×maxn−(r−l+1)
所以只要维护区间中某个数出现的最大次数即可,莫队或者主席树维护
(主席树以区间下标为时间轴,每次只要线段树二分查询是否存在点 > ⌈ n 2 ⌉ >\lceil {n \over 2} \rceil >⌈2n⌉,易证查询时间复杂度O ( l o g n ) (logn) (logn))
P3203 [HNOI2010] 弹飞绵羊
CF13E Holes
分块,对于每个点,维护跳出当前块需要多少步,跳出后到达哪个点,这样修改只要 O ( n ) O(\sqrt n) O(n) 块内倒序暴力重构,查询因为是一个块一个块地跳,所以也是 O ( n ) O(\sqrt n) O(n)。要计算最后从哪个点跳出,需要保留一下跳块时的最后跳出点,再看是否能一个点一个点地继续往后跳
CF455D Serega and Fun
强制在线,首先考虑朴素做法,对于整体来说,单次修改时间复杂度为 O ( n ) O(n) O(n),考虑分块,对于修改一个区间,如果包含了一些块,这个块只要弹出块尾,添加块首即可,用双端队列可以做到 O ( 1 ) O(1) O(1)维护,对于两端只有不完整的块, d e q u e . e r a s e O ( n ) deque.erase O(\sqrt n) deque.eraseO(n)解决
那么对于查询,只需要维护块内每个数出现了多少次
最后特判一下区间 [ l , r ] [l,r] [l,r]在同一个块的情况