2024.7.27 test
A
有 \(n\) 个火炬,分为寒冰的和火炬的,你要在这 \(n\) 个火炬前放置豌豆射手,给出每个豌豆射手的伤害。
求对于所有区间 \([l,r]\),在这些火炬前自由放置豌豆,到达最后一个火炬之后最大伤害的和。
其中如果最后是火炬/寒冰的豌豆伤害翻倍。\(n\le 1e6\)。
注意到如果有两个相邻的火炬/寒冰射手,那么前面的豌豆无论如何伤害都相同。
那么我们把相邻的火炬/寒冰都缩成段,剩下的都是交替出现的。
我们往后扫右端点,左边是先是交错的,再往前是相同的,发现剩下的都可以直接算出来。
B
在 \(n\times m\) 的草坪上,有若干大蒜,僵尸从右边开始走,询问每个 \(i\) ,第 \(i\) 行开始走最后能到多少行。
满足一列中不存在连续的三个大蒜。\(n,m\le 3000\)。
这是个 DAG 上求到达点集的问题,最优也是 \(O(n^3/\omega)\)。考虑挖掘性质。
我们考虑从终点往回推,注意到满足一列中不存在连续的三个大蒜,那么能到的行一定是一个区间。
证明是:设我们当前能到的只有一行,如果当前上/下方有一个大蒜,那么我们可以推到到上/下方这行。
如果要使得变成间隔开的两行,那么必须满足当前有三个连续的大蒜,是不合法的。
如果当前已经是区间了,那么更无法割裂这个区间。
所以逐个往回推即可,复杂度 \(O(nm)\)。
C
有一棵树,初始每个节点上有一个尖刺。\(m\) 次操作,每次给定一个点 \(x\),所有尖刺向 \(x\) 移动 \(d\) 的距离。
每次操作完后,查询有多少个节点上有尖刺。\(n,m\le 5e5\)
不难发现有尖刺的点构成一个联通块,每次移动 \(1\) 的距离相当于删掉叶子,并新加一个点。
那么,总共的删叶子的次数是 \(O(n+m)\),直接暴力维护即可。
D
有 \(n\) 条从 \(y=0\) 出发的射线,\(k>0\)。有 \(m\) 个屏障,位于 \((x,y_1\sim y_2)\),你要求每个射线是否穿过屏障。
\(n,m\le 8e4\)。
考虑 \(n\) 比较小怎么做,计算出所有射线的交点,就可以在 \(x\) 增大的同时维护所有射线当前大小关系。
那么我们对于每个屏障,在当前已经维护好的序列上二分即可。
那么 \(n\) 比较大,考虑分块,分成 \(\dfrac{n}{B}\) 块,每块都做一遍上面的过程就行了。
复杂度 \(O((B^2+m)\dfrac{n}{B}\log n)\le O(n\sqrt n\log n)\)。