20200903 专题:值域分块

本文介绍了如何使用值域分块技术解决带插入区间K小值的问题。通过先对序列分块,然后在每个块内对值域进行分块,利用链表实现方便的查询和修改操作。在查询时,可以快速找到指定范围内的k小值,而插入和修改操作则通过更新序列块中的值域前缀和来完成。当块内元素过多时,可以通过分裂块来保持效率。代码实现和问题分析为理解这一技术提供了清晰的示例。
摘要由CSDN通过智能技术生成

总览:

做了一道毒瘤题 带插区间k小
并且树套树常数过大,过不去 (毒瘤出题人毒瘤卡常)
于是就学习了新科技:值域分块

实质是分块套分块,先给序列分块,再在每个块中给值域分块
(分块用链表实现好方便
具体题目具体分析

T1 P4278 带插入区间K小值

思路:
bzoj一个点平均15s,luogu一个点1s……

先对序列分块,方便取出 [ l , r ] [l,r] [l,r]
再对值域分块,方便查询 k k k
O ( 1 ) O(1) O(1) 查询 [ l , r ] [l,r] [l,r] 中值在 [ v a l l , v a l r ] [val_l,val_r] [vall,valr] 中的数的个数
于是可以对值域做序列上的前缀和
查询时先 O ( n ) O(\sqrt n) O(n ) 将块取出,再 O ( n ) O(\sqrt n) O(n ) 找到 k k k
修改,插入时要更新每个序列块中一个值域块前缀和, O ( n ) O(\sqrt n) O(n )
如果在一个块中插入过多,将这个块分裂成两个块即可

块状链表实现
找个人少的时候卡过去

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC op
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值