【LuoguP4887】第十四分块(前体)

博客讲述了如何解决 Luogu P4887 题目,该题涉及到区间两数异或在二进制下有 k 个 1 的对数的查询。博主分析了普通莫队解法的局限性,并提出将区间查询转化为前缀相减形式,通过预处理和优化存储降低空间复杂度,从而避免 TLE 和 MLE 错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意

区间两数异或在二进制下有 k k k 1 1 1 的对数。

Sol

普通莫队的话,如果要实时维护好区间内的答案需要支持区间对一个数求答案。
直接做不是很好做,容易发现其实这也就是一个区间询问。那么可以把莫队中要求的东西再次离线下来。
我们把上述询问拆成前缀相减的形式,这样我们要做到就是多次询问一个前缀对一个数的答案。
由于在数据范围下二进制下有 k k k 1 1 1 的数并不是太多,我们可以直接从前往后做,遇到一个数 x x x 则把 x ⊕ n u m b e r ( k ) x\oplus number(k) xnumber(k) 加入桶中 ( n u m b e r ( k ) number(k) number(k)表示二进制下有 k k k 1 1 1的数)。当我们遇到一个询问 数 y y y 和当前前缀的答案时,只需要看 y y y 的桶被加入了多少个数就行了。

复杂度分析: 由于询问个数和莫队移动次数同阶,为 O ( n n ) O(n\sqrt n) O(nn ) ,查询复杂度是 O ( 1 ) O(1) O(1) 的所以查询复杂度就是 O ( n n ) O(n\sqrt n) O(nn )。然后我们每加入一个数需要 最多 ( 14 7 ) {14\choose 7} (714)次插入操作,所以这部分复杂度为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值