Loading

[专题总结]数据结构 - 离线/根号

P7882 [Ynoi2006] rsrams

很套路的一道根号题。

先考虑一个莫队,枚举一个颜色计算他的贡献,加入一个点就是他和之前所有的贡献。

如果把这个颜色设成 \(1\), 不是这个颜色设成 \(-1\), 条件就是 \(pre_r > pre_{l-1}\)

查询这个区间内有多少 \(pre_r > pre_{l-1}\) ,由于变化是 \(\pm 1\) , 所以我们这直在莫队的的时候维护一个桶和指针就可以 \(O(1)\) 转移。

莫队的时候开桶维护是基本操作,别脑抽。

现在枚举颜色是很炸的,但是如果我们可以 \(O( \text{c=颜色点数})\) 算出这个颜色的贡献,是不是就有希望了呢?

由于我们找的是前缀和为 \(0\) 的点数,我们一共有 \(c\)\(+1\) , 那么最多有 \(c\) 个位置可以形成区间和是 \(0\)

所以我们把关键点全部拿出来,再把询问附在这些区间上,那么做一次是 \(m+c\sqrt m\) 的。

这个时候考虑根号分治,那么 \(> \sqrt m\) 的可以直接用上面的暴力去做。

\(\leq \sqrt m\) 的,由于数一共有 $ \sqrt m$ 个,那么区间长度不超过 \(2*\sqrt m\), 所以我们把所有的区间拿出来看合不合法,合法我们就把包含他的矩形答案加 \(1\) .

由于一共有 \(n\sqrt m\) 个区域, \(m\) 个查询,所以用 \(O(1)-O(\sqrt n)\) 的分块去扫描线解决问题,复杂度单根号。

CF1129D Isolation

img

首先考虑这个 nt 的 dp, 现在就是去优化他,变成了一个正宗的数据结构问题。

先考虑一个朴素的分块做法,每个块开一个树状数组和一个偏移量,暴力的去修改查询。

观察一下关键性质:修改只有加一减一,我们在每个块上开一个桶,在桶上维护一个指针

整块修改直接暴力去挪指针,最多变化 \(O(1)\) ,散块修改直接暴力更改一下桶就行了。

这两道题可以说是很水的,但是自己就是没有去掌握 “开桶来解决变化量很小” 这个问题。

NOI模拟 7.26 A

数据范围指引根号,跳跃长度最多为 \(O(n)\) ,考虑根号分治,小于根号预处理,大于根号倍增跳,最多跳 \(\sqrt{n}\) 次。

当然,大于根号的可以优化成 \(O(\sqrt n)\),类似光速幂的思想,每个点处理出来 \(\leq \sqrt n\) 的所有和 \(> \sqrt{n}\) 的每 \(\sqrt{n}\) 一个点值,即可达到 \(O(1)\) 跳跃。

光速幂思想优化倍增,是去 log 的常用手段。

posted @ 2022-05-20 07:05  Soresen  阅读(94)  评论(0编辑  收藏  举报