【题解】Solution Set - NOIP2024集训Day5 扫描线
【题解】Solution Set - NOIP2024集训Day5 扫描线
「CF1401E」Divide Square
先把每一条线多出来的那些部分给截去。
然后每一条竖着的线可以把她的向前/向后的横着的线分成两半。
实际上也没什么用
结论: \(Ans=\) 正方形内交点个数 + 贯穿整个边长的线段数 + 1
证明:
我们还是先把每一条线多出来的那些部分给截去,发现这样并不改变交点个数。
然后考虑动态加线段的过程。
一开始一条边都没有,显然整个答案为整个正方形为 \(1\)。
分讨:
-
如果没有完全贯穿。
一个交点肯定就对应了一个矩形。
-
完全贯穿,就拆分成前后两个没有完全贯穿的线段,但是还要加上最中间的一个。
「CF283E」Cow Tennis Tournament
先对 \(a_i\) 排序。每一次操作等价于一个区间。
既然是扫描线,我们考虑把每一条边用个坐标来表示,一开始是一个右下的直角三角形。
每次相当于对一个小三角形沿 \(y=x\) 翻折。
发现每次操作其实是独立的,也就是说可以交换顺序。
实际上还是没什么用。😥
https://www.luogu.com.cn/article/6grc5thr
扯一下,题解到底在干嘛。
\(a_{i,j}\) 如果是 \(1\) 的话,说明 \(i\) 有一条出边,所以就是对于每个 \(i\) 问线段树上除了自己的总和。
对于每个修改 \([l,r]\),就是对于每个 \(i\in[l,r]\),把她那棵线段树上的 \([l,r]\) 去加取反。
然后如果我们从小到大枚举 \(i\),只需要在 \(l,r+1\) 的时候取反就可以了。相当于把修改差分了一下。
吐槽一下,不是这个题为什么也是扫描线啊(不会就是这个差分吧。😅
「Hdu5770」Treasure
考虑枚举每个起点,显然她的路径肯定是先往上一截(可以为 \(0\)),再往下走子树。
感觉暴力枚举起点来找终点好像没什么前途。
考虑把每个宝箱需要的链找出来,具体的:对于宝箱 \(a,b,v\),设 \(c=\text{lca}(a,b)\)。
然后考虑什么样的起点/终点能包含她。(这个没想到
设:\(\text{subtree}(a)\) 表示 \(a\) 的子树,\(\text{son(a,b)}\) 既是 \(a\) 的儿子又在链 \(a-b\) 上的点。
分讨:
- \(a\ne c,b\ne c\):\(s\in \text{subtree}(a),t\in\text{subtree}(b)\)。
- \(a=c,b\ne c\):\(s\not\in\text{subtree}(\text{son}(a,b)),t\in\text{subtree}(b)\)。
- \(a\ne c,b=c\):\(s\in\text{subtree}(a),t\not\in\text{subtree}(\text{son}(b,a))\)。
- \(a=b\):只要 \(s,t\) 不属于 \(a\) 的某一个儿子的子树就行。
上面这些都不难用 dfn 序刻画为一个矩形,所以我们就是求这个矩形的单点最大值。
这样就可以扫描线了。
注意 \(a=b\) 的情况对于相同的 \(a_i,a_j\) 我们累加在一起只处理一遍,不然会被菊花图卡掉。