分块 莫队

文章讨论了在多项编程竞赛题目中,如何利用区间维护(如莫队、树转链、主席树等)以及数据结构优化(如线段树、队列操作)来解决涉及数字出现次数、颜色统计、路径贡献等问题,强调了在线性和空间效率上的策略。
摘要由CSDN通过智能技术生成

CF940F Machine Learning
莫队维护区间每个数字出现的次数,维护某个出现次数是否出现过,暴力枚举mex即可,易证每次枚举最多 n \sqrt n n

CF375D Tree and Queries
树转链,莫队维护区间每个颜色出现的次数,如果再单纯维护次数为k的颜色有多少,最后枚举 1 − k 1-k 1k,超时,所以直接维护次数 > = k >=k >=k的颜色有多少

P4074 [WC2013] 糖果公园
树转链,莫队维护区间,按题意计算新加一个点的贡献。但是发现询问是一条路径,是多个不同的区间合起来的答案,所以树转链用欧拉序列,维护每个点遍历到和回溯到的时间戳,然后将两点的路径转换为区间问题,如果一个点在区间中出现两次,说明不在路径上,贡献抵消。然后特判一下 l c a ( x , y ) lca(x,y) lca(x,y)是否与 x , y x,y x,y不重合,单独计算 l c a ( x , y ) lca(x,y) lca(x,y)的贡献

CF1514D Cut and Stick
如果整个序列中没有数超过 ⌈ n 2 ⌉ \lceil {n \over 2} \rceil 2n的数,不用划分序列
如果有,当且仅有一个,只需要把这个数用其他数尽可能放到一个序列中,再将这个数剩下的单独成一个序列即可
得出组数为 2 × m a x n − ( r − l + 1 ) 2 \times maxn-(r-l+1) 2×maxn(rl+1)
所以只要维护区间中某个数出现的最大次数即可,莫队或者主席树维护
(主席树以区间下标为时间轴,每次只要线段树二分查询是否存在点 > ⌈ n 2 ⌉ >\lceil {n \over 2} \rceil >2n,易证查询时间复杂度O ( l o g n ) (logn) (logn)

P3203 [HNOI2010] 弹飞绵羊
CF13E Holes
分块,对于每个点,维护跳出当前块需要多少步,跳出后到达哪个点,这样修改只要 O ( n ) O(\sqrt n) O(n ) 块内倒序暴力重构,查询因为是一个块一个块地跳,所以也是 O ( n ) O(\sqrt n) O(n )。要计算最后从哪个点跳出,需要保留一下跳块时的最后跳出点,再看是否能一个点一个点地继续往后跳

CF455D Serega and Fun
强制在线,首先考虑朴素做法,对于整体来说,单次修改时间复杂度为 O ( n ) O(n) O(n),考虑分块,对于修改一个区间,如果包含了一些块,这个块只要弹出块尾,添加块首即可,用双端队列可以做到 O ( 1 ) O(1) O(1)维护,对于两端只有不完整的块, d e q u e . e r a s e O ( n ) deque.erase O(\sqrt n) deque.eraseO(n )解决
那么对于查询,只需要维护块内每个数出现了多少次
最后特判一下区间 [ l , r ] [l,r] [l,r]在同一个块的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值