20200903 专题:值域分块

总览:

做了一道毒瘤题 带插区间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、付费专栏及课程。

余额充值