根号算法
莫队
P3674 小清新人渣的本愿
莫队 + \(bitset\) 的傻逼题
P5072 [Ynoi2015]盼君勿忘
枚举出现次数为 \(x\) 的数, 在莫队上根号分治就好了
P4887 【模板】莫队二次离线(第十四分块(前体))
把莫队的询问再次离线扫描线维护就好了
P5047 [Ynoi2019模拟赛]Yuno loves sqrt technology II
二次离线莫队基础练习题
分块
P5046 [Ynoi2019模拟赛]Yuno loves sqrt technology I
处理块内答案,一个数对一个块前缀的贡献,一个块前缀的答案,一个块后缀的答案就好了。
CF356D Bags and Coins
做一遍背包,用这 \(n\) 个数去填 \(s\)。最大的数必填。在背包里面的数是在最外面的包。然后最大的数包含不在背包里面的最大数,不在背包里面的最大数包含不在背包里面的次大数,不在背包里面的次数包含不在背包里面的次次大数,以此类推。用 bitset 维护一个背包即可。
可惜过不了,被卡空间,那么分块,对于每一个块的顶端记录一下他的 bitset,然后最后块内递推。
空间复杂度 \(O(\frac{n B}{64} + \frac{n s}{64 B})\), 时间复杂度 \(O(\frac{nq}{64})\)
CF487D Conveyor Belts
直接分块,每次修改的时候重构块,查询从下往上一块一块跳即可。
CF455D Serega and Fun
这个可以用 \(deque\) 维护分块,维护一个 \(cnt\) 数组维护每一个数的出现次数。
(直接暴力可以过)
P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
维护块间的众数,和每一个数出现的位置。查询时答案要么是块间的众数,要么是零散块的数。
对于零散块的贡献暴力枚举能把答案更新多少即可(例:左零散块的位置 \(x\),查询从位置 \(x\) 开始,第 \(ans + 1\) 次出现 \(a_x\) 的位置是否 \(\le r\),如果满足就把答案增加 \(1\))。
根号分治
P5309 [Ynoi2011]初始化
对 \(x\) 根号分治, 然后用分块 \(O(1)\) 修改 \(O(\sqrt n)\) 算就好了。
P5355 [Ynoi2017]由乃的玉米田
前面 \(3\) 个操作和 P3674 一样, 最后除法的操作有点巧妙
对于 \(x \le \sqrt n\) 的, 枚举 \(x\), 然后 \(O(n)\) 做就好了
对于 \(x > n\), 然后在莫队上暴力做就好了
CF348C Subset Sums
分治与下序列的大小即可。
SP22412 DIVFACT3 - Divisors of factorial (hard)
显然可以把阶乘拆成质数做,然后这样是 \(O(n)\) 的。
考虑根号分治(?) ,大于 \(\sqrt n\) 的质数出现次数为 \(1\), 小于 \(\sqrt n\) 的质数出现次数暴力即可。