脑洞:整体分块 + BSGS

Ran 让 EI 刷整体二分的题,并且丢给 EI 一道「ZJOI2013」K大数查询

但是 EI 并不想写整体二分。也不想写数据结构。于是一拍脑门,就有了这个奇怪的想法。

大致思路:对于 c c 先离散化,然后考虑一个类似 BSGS 的找答案的过程:将从大到小的 c c 分成 M \sqrt M 段,按顺序计算每个询问的区间中有多少个数落在第 i i 段内的颜色中。该过程发生 M M 次修改和 Θ ( M M ) \Theta(M\sqrt M) 次询问,我们不妨使用一个块状数组来维护,即可做到时间 Θ ( M ( N + M ) ) \Theta \left(M(\sqrt N + \sqrt M)\right) 。这是 Giant step,接着 Baby step 我们的做法几乎是相同的,复杂度也一致。

对于这道例题而言无疑不算一个时间复杂度很优秀的解,但是常数小,代码不算难写。如果遇到一些树形结构无法维护的问题时,该思路就显得有一定优势了。(或许?)

猜你喜欢

转载自blog.csdn.net/EI_Captain/article/details/90815937