CSP-S 2024 第三次
这种级别的线段树都会写挂了吗……看来还得训数据结构
A
\(f_{i,j}\) 表示填到 \(p_j\),在 \(p_j\) 填了 \(i\) 的方案数。
当然 C 和 F 是独立的,可以分别 DP。
B
直接用并查集合并要合并的点,维护每个连通块的最浅点就可以找出路径上的所有连通块。
C
先求出凸包 \(A\),调整法可以证明光纤的斜率一定与凸包的某一条边相同。
光纤的斜率与边 \(A_iA_{i+1}\) 相同时,设凸包上离 \(A_iA_{i+1}\) 最远的点为 \(j\),则此时答案为 \(j\) 到 \(A_iA_{i+1}\) 的距离的一半。
枚举光纤的斜率与哪条边相同,用旋转卡壳求出离这条边最远的点,更新答案即可。
D
考虑一次询问,对于询问区间中第 \(i\) 个正号连续段,记 \(c_i\) 为其中所有数的乘积乘上其长度,则答案为 \(c\) 的所有子区间和之和,
假设有 \(k\) 个正号连续段,则所求即为 \(\sum\limits_{i=1}^kc_i\times i\times(k-i+1)\)。
考虑线段树,维护区间左侧极长正号连续段的长度及乘积,右侧极长正号连续段的长度及乘积,正号连续段个数,
还有 \(\sum\limits_{i=1}^kc_i\),\(\sum\limits_{i=1}^kc_i\times i\),\(\sum\limits_{i=1}^kc_i\times(k-i+1)\),\(\sum\limits_{i=1}^kc_i\times i\times(k-i+1)\),
这样除了 \(4\) 操作就都能做了。
在线段树的每个节点上,维护 \(b_l\) 表示长度为 \(l\) 的正号连续段的 \(i\times(k-i+1)\) 之和,然后四操作就能做了。
注意到长度为 \(L\) 的节点上的 \(b\) 只会有 \(\sqrt L\) 个位置,所以对一个长度为 \(L\) 的节点 push up 复杂度为 \(O(\sqrt L)\),
而 \(\sum L=O(n)\),所以修改一次的复杂度为 \(O(\sum\sqrt L)=O(\sqrt n)\)。
太难写了先咕了,但是数据太水了 4 操作暴力做都能过,,,