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 操作暴力做都能过,,,

posted @ 2024-09-23 18:09  5k_sync_closer  阅读(58)  评论(2编辑  收藏  举报