根号杂题选做

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][ed1]。暴力扫两个散块,第一次扫到一个数时加上 [ s t + 1 , e d − 1 ] [st+1,ed-1] [st+1,ed1] 的整块的贡献,维护出现次数最大值及对应的数即可。若没扫到过 p [ s t + 1 ] [ e d − 1 ] p[st+1][ed-1] p[st+1][ed1],还要再将最大值再与它的出现次数进行比较。

注意桶的动态清空,复杂度不要假掉。

错误思路:

大概是刚学过摩尔投票,上来就有点魔怔。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,l11,1,r2)q(1,r1,1,l21)+q(1,l11,1,l21),这样就可以用莫队求了,每个询问 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 ll1 是删除, l ← l + 1 l\gets l+1 ll+1 是增加。

序列

传送门

欢迎收看 O ( n n log ⁡ n ) O(n\sqrt n\log n) O(nn logn) 轻松过 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,tim1],注意特判 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值