CSP-S 2024 第二轮简要题解
嗯,先看一眼题哈...首先是 T1 决斗,题号是 P11231
这题也没啥难度,直接贪心就行,排序一下,容易发现每次让还可以攻击的怪物去攻击目前的最小值是最优秀的一个做法,那么就做完了。
复杂度是 $O(n \log n) $
然后是 T2 啦,嗯...第一问随便维护一下就出来了,这里就不说了
对于第二问,我们可以考虑区间求交,如果暴力的去计算每个会超速的车的超速区间很明显不太优,那我们考虑进行分类讨论哈。
如果 a 比 0 小那么只有两种对应的情况,就是说一种是小 v 比大 V 要小,因为加速度是负的所以这里不可能会超速,也就没有对应的超速区间
如果小 v 比大 V 要大,那么我们就可以求出一个超速的区间,在区间里任意一个摄像头都可以拍到超速
如果 a = 0 就好维护了,只要判断最开始小 v 与大 v 的关系就行,那我们就可以求出对应的区间
如果 a > 0 呢,只要找到速度正好等于 v 的那个瞬间就可以得到超速区间
这些计算的时候可以向上取整来代替浮点数运算,防止精度丢失。
我们对于这些区间根据右端点排序,然后相互合并即可,如果没有被覆盖就取右端点。
嗯,这样 T2 就做完了...看一眼 T3
这题一眼是动态规划,而且是非常板的分段 dp,设 \(f_{i,j}\) 表示前 i 个数在最后一个数字颜色是 j 情况下的最大得分,其中 j 只有 0 和 1 两种取值
我们对于第 i 位的贡献情况来分类讨论,如果没有贡献我们可以直接去在前两位求一个 max
有贡献的话肯定要选取前面的最后一个与当前 \(a_{i}\) 相同的,这里很显然。
我们设一下,让这个数的位置是 last,则 \(f_{i,0}\) 就等于 \(a_i\) 加上 \(f_{last+1,1}\) 加上把 last+1 到 i-1 全部染成一个颜色可以得到的收益,这里前缀和一下就可以维护
\(f_{i,1}\) 也是同理的解决。最后只要两个取一个 max 就行
T4 比较魔怔,需要一个线性做法,我不会,看了别人的才懂的,原题解放这里
我们先把整个过程看做一颗完全二叉树,容易发现当且仅当以下两个条件都满足的情况下才能走到最后:自己擂主时能力值够大,别人擂主时别人的能力值够小。
对于第一个条件,我们枚举每个点到根最后一次当擂主的轮数就行,第二个条件则需要预处理出每个子树的最小值。
可以发现实际上每个子树只有两种可能,一个是胜出者固定为某个人,另一个则是胜利者的能力值可以取当前轮数以上的任意值,设 \(f_u\) 表示子树 \(u\) 的胜出者能力值,对于 \(f_u = -1\) 我们可以任取
让 \(h_u\) 表示子树 \(u\) 的轮数,那么设左儿子是擂主,可以列出转移方程
可以发现在 n 个人逐渐加入的时候任意一个点 f 总是初始化为 -1,在变为非负数之后又会一直不变,所以加入的时候从对应的节点往上更新 f 直到某个点 f 不变,总复杂度线性
我们还能发现 \(f_u\) 大于等于 \(h_{fa}\) 的时候如果 \(f_u>0\),那么 \(u\) 的兄弟节点就没有可能走到最后了,我们维护 \(g_u\) 表示加入第几个的时候 \(u\) 中的人再也不能走到最后。
全部加入后求出每个点到 \(root\) 路径上 \(g\) 的最小值就可以得到叶子处的 \(g\),差分一下就可以解决了
对了,今天是我的生日,我能厚颜无耻的要个祝福吗