浅谈扫描线状物
浅谈扫描线状物
我看到很多人对于扫描线的理解不够深刻,所以特地来写一篇关于扫描线状物应用的文章。
选了点印象深刻的题目和最近做的。
基础扫描线
扫描线最基本的应用和一般人入坑扫描线都是来自于一个题:求一车矩形面积并。
这个东西你就考虑在
例题#1
首先来看一个比较简单的题。
给定一颗树,点数
10^5 ,定义f(l,r) 表示仅保留l \sim r 的点的连通块个数,求\sum_{i=1}^{n}\sum_{j=i}^{n}f(i,j)^k ,其中1 \leq k \leq 10 。
我们先来想一下
我们考虑
我们从打到小扫描
再来考虑一般的情况。
问题转化为了区间加
不难考虑改为权值线段树,维护
复杂度
例题#2(P9893)
问题问的是极差,我们先来看怎么求最大值的最小值。
开个线段树,我们维护
合并不难,枚举中间两个是否连在一起即可。
我们从小到大枚举扫描最小值,表示禁用了
例题#3(P9895)
具体细节可以去看 P9895 【ICPC2018 Qingdao R】 Airdrop。
首先所有人都只会先 y 轴移动,然后再在 x 轴移动。
所以注意到所有的碰撞都在
我们开个线段树,维护一个曼哈顿距离对应的点的个数,具体怎么统计呢?我们从下往上扫
因为每线段树维护的序列上每一个位置,
然后就是注意到我们不能扫所有的,只要把
例题#4(CF2009G3)
作为一道罕见的 div4 有脑子题,这题也使用了扫描线的思想。
首先是根据 G1,我们可以求出每个长度为
我们刻画
那么问题等价于询问区间所有子串最小值之和。
我们离线,按照左端点从大到小扫描
总结
扫描线是一种神奇的思想,它利用了你需要重复加入结构的繁琐,用扫描时间轴或任意一个轴,来达到将一段的存在区间,转化为出现和消失两个时刻,从而达到离线快速处理询问。