qwq
[Violet]蒲公英
分块,离散化后维护前 i i i 个块中数j的出现次数 s u m [ i ] [ j ] sum[i][j] sum[i][j] 以及块 i i i 到块 j j j 的最小众数 p [ i ] [ j ] p[i][j] p[i][j],时间复杂度 O ( n n ) O(n\sqrt n) O(nn)。
查询区间 [ x , y ] [x,y] [x,y] 时,假设 x x x 在第 s t st st 个块, y y y 在第 e d ed ed 个块,可能为答案的便只有 [ x , r s t ] , [ l e d , y ] [x,r_{st}],[l_{ed},y] [x,rst],[led,y] 中的数以及 p [ s t + 1 ] [ e d − 1 ] p[st+1][ed-1] p[st+1][ed−1]。暴力扫两个散块,第一次扫到一个数时加上 [ s t + 1 , e d − 1 ] [st+1,ed-1] [st+1,ed−1] 的整块的贡献,维护出现次数最大值及对应的数即可。若没扫到过 p [ s t + 1 ] [ e d − 1 ] p[st+1][ed-1] p[st+1][ed−1],还要再将最大值再与它的出现次数进行比较。
注意桶的动态清空,复杂度不要假掉。
错误思路:
大概是刚学过摩尔投票,上来就有点魔怔。Hack 数据: 4 1 4 5 2 4 2 3 4\ 1\ 4\ 5\ 2\ 4\ 2\ 3 4 1 4 5 2 4 2 3,查询 [ 1 , 4 ] [1,4] [1,4],如果摩尔投票,第一个块的 4 4 4 会被屏蔽掉,使得求出来答案为 1 1 1 /kk
[SNOI2017]一个简单的询问
莫队没法一起求两个区间,所以考虑差分,即 q ( l 1 , r 1 , l 2 , r 2 ) = q ( 1 , r 1 , 1 , r 2 ) − q ( 1 , l 1 − 1 , 1 , r 2 ) − q ( 1 , r 1 , 1 , l 2 − 1 ) + q ( 1 , l 1 − 1 , 1 , l 2 − 1 ) q(l1,r1,l2,r2)=q(1,r1,1,r2)-q(1,l1-1,1,r2)-q(1,r1,1,l2-1)+q(1,l1-1,1,l2-1) q(l1,r1,l2,r2)=q(1,r1,1,r2)−q(1,l1−1,1,r2)−q(1,r1,1,l2−1)+q(1,l1−1,1,l2−1),这样就可以用莫队求了,每个询问 q ( 1 , l , 1 , r ) q(1,l,1,r) q(1,l,1,r) 动态维护两个数组记录 [ 1 , l ] [1,l] [1,l] 和 [ 1 , r ] [1,r] [1,r] 中每个数的出现次数就能求出答案。
注意这里和平时求 [ l , r ] [l,r] [l,r] 答案的莫队不一样, l ← l − 1 l\gets l-1 l←l−1 是删除, l ← l + 1 l\gets l+1 l←l+1 是增加。
序列
欢迎收看 O ( n n log n ) O(n\sqrt n\log n) O(nnlogn) 轻松过 1 e 5 1e5 1e5 /fad
发现时间轴 + 位置实际上是二维偏序,可以考虑扫描线,把 [ l , r ] [l,r] [l,r] 加 x x x 拆成 [ l , n ] [l,n] [l,n] 加 x x x 和 [ r + 1 , n ] [r+1,n] [r+1,n] 减 x x x,将修改和询问都按位置排序,在时间轴上分块,修改即为区间修改 [ t i m , m ] [tim,m] [tim,m]( m m m 为总操作次数),询问即为询问 [ 1 , t i m − 1 ] [1,tim-1] [1,tim−1],注意特判 t i m = 0 tim=0 tim=0 是否有贡献。
具体地,分块维护每个时间值的变化量,对于每个块内的元素从大到小排序,即可二分求出整块答案。
Xenia and Tree
考虑两种暴力:每次查询暴力扫描前面的红点求距离 / 每次修改暴力更新其余点答案,看到这两种暴力容易想到对操作进行根号分治。
设块长为 S S S,在每个块结束之后用这个块内被修改的所有点 BFS 更新答案,时间复杂度 O ( n m S ) O(\dfrac{nm}{S}) O(Snm);对于块内询问,暴力扫描块内被修改的点更新答案,时间算上求 LCA 复杂度 O ( m S S 2 log n ) O(\dfrac{m}{S}S^2\log n) O(SmS2logn)。根据基本不等式得 S = n log n S=\sqrt{\dfrac{n}{\log n}} S=lognn 时复杂度最优为 O ( m n log n ) O(m\sqrt{n\log n}) O(mnlogn)。
注意块内求答案不要更新 a n s [ x ] ans[x] ans[x],不然整块 BFS 会出锅/kel