根号数据结构

根号数据结构

分块

莫队

根号分治

例题1 P9809 [SHOI2006] 作业 Homework

给定一个集合为 S,初始为空,你需要执行以下两个操作共 N 次。
操作一,在集合 S 中加入一个新元素,其代号为 X,保证 X 在当前集合中不存在。
操作二,在当前的集合 S 中询问所有元素 mod Y 最小的值。

N = 1e5, V=3e5(值域)

对 Y 根号分治。

小于块长的 Y ,把每一个 x 对每一个 Y 处理出答案取 min

对于大于块长的 Y,只有 n / 块长 个不同的,维护一个有序数组(可以用set维护),
于是对于每一个 y ,枚举每一个 ky ,算出最接近 ky 的数,然后用减法代替取模。
注意,这里还蕴含了一种错解不优的思想。这种做法带了一个log

第二种处理大于块长的 Y 的方法是对值域分块,每个块维护两个信息。

  1. 大于这个块右端点的数的最小值
  2. 处于这个块的数要去更新这个块内其他小于这个数的位置的最小值信息。
    这个做法显然是不带根号的。

对于第一种做法,我认为取 nlogn 会快一点,但实测下来 300 最快。

根号重构

根号打标

posted @   花子の水晶植轮daisuki  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js
点击右上角即可分享
微信分享提示