【题解】Solution Set - NOIP2024集训Day5 扫描线

【题解】Solution Set - NOIP2024集训Day5 扫描线

「CF1401E」Divide Square

先把每一条线多出来的那些部分给截去。

然后每一条竖着的线可以把她的向前/向后的横着的线分成两半。

实际上也没什么用


结论: \(Ans=\) 正方形内交点个数 + 贯穿整个边长的线段数 + 1

证明:

我们还是先把每一条线多出来的那些部分给截去,发现这样并不改变交点个数。

然后考虑动态加线段的过程。

一开始一条边都没有,显然整个答案为整个正方形为 \(1\)

分讨:

  1. 如果没有完全贯穿。

    一个交点肯定就对应了一个矩形。

  2. 完全贯穿,就拆分成前后两个没有完全贯穿的线段,但是还要加上最中间的一个。


「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\) 上的点。

分讨:

  1. \(a\ne c,b\ne c\)\(s\in \text{subtree}(a),t\in\text{subtree}(b)\)
  2. \(a=c,b\ne c\)\(s\not\in\text{subtree}(\text{son}(a,b)),t\in\text{subtree}(b)\)
  3. \(a\ne c,b=c\)\(s\in\text{subtree}(a),t\not\in\text{subtree}(\text{son}(b,a))\)
  4. \(a=b\):只要 \(s,t\) 不属于 \(a\) 的某一个儿子的子树就行。

上面这些都不难用 dfn 序刻画为一个矩形,所以我们就是求这个矩形的单点最大值。

这样就可以扫描线了。

注意 \(a=b\) 的情况对于相同的 \(a_i,a_j\) 我们累加在一起只处理一遍,不然会被菊花图卡掉。


posted @ 2024-08-12 09:37  CloudWings  阅读(14)  评论(0编辑  收藏  举报