2024.11.5总结


A:

题目可变为:从一个点 xx 走到左侧或右侧第一个 y(yx)\geq y(y \leq x) 的位置需要花费 lxl_{x}rxr_{x} 的代价,多次查询最短路。

首先观察一个点 xx 只往 aa 值高于自己的位置走能走到哪些点。

找到左侧从 xx 出发的后缀 max\max ,右侧从 xx 出发的前缀 max\max ,显然可以在这些位置之间左右横跳,并且由于 lil_{i} 单增, rir_{i} 单减的性质,如果想要走到这些点,一定不会在其中一步不往上走;同理如果想从这些点往 xx 走,也不会在其中一步不往下走。

先假设 aa 是一个排列,然后我们构造一棵 O(n)\mathcal O(n) 个点的树,对于一个点 xx ,找到右侧第一个 xx^{\prime} 满足 ax>axa_{x^{\prime}}>a_{x} (左侧同理),把这个 pair 看做一个点,将它的父亲设为 xx 往左(右)走一步与 xx^{\prime} 构成的 pair 对应的点。

这样,对于一个 (x,x)\left(x, x^{\prime}\right) 的点,如果已知到 xx 的最短路径长度与到 xx^{\prime} 的最短路径长度,其到它的父亲对应的最短路径长度即为乘上一个 2×22 \times 2 的矩阵( (max,+)(\max ,+) 乘法),倍增一下即能快速算出儿子到祖先的最短路(祖先到儿子同理)。

对于一名旅客,设起点为 ss ,终点为 tt ,不妨设 s<ts<t ,设中间 aa 的最大值为 apa_{p} 。最短路一定是 spts \rightarrow p \rightarrow t 或者 ss 走到 ss 左侧第一个 >ap>a_{p} 的点再走到 tt 右侧第一个 >ap>a_{p} 的点再走到 tt ,这两种情况中间过程均可表示为树上的祖先与儿子之间的最短路,直接倍增求值即可。

一道只需要倍增的数据结构题。

时间复杂度 O(nlogn)\mathcal O(n \log n)

B:

不太懂放这么个打表题想表达什么。

C:

初始矩阵:

E=[001]E= \left[ \begin{matrix} 0&0&1 \end{matrix} \right]

加入一个 tt

T=[100001012]T= \left[ \begin{matrix} 1&0&0\\ 0&0&-1\\ 0&1&2\\ \end{matrix} \right]

加入一个 dd

D=[001010102]D= \left[ \begin{matrix} 0&0&-1\\ 0&1&0\\ 1&0&2\\ \end{matrix} \right]

X=T×DX=T\times D,每次转移就是 XX×X×TX\leftarrow X\times X\times T

预处理前 10610^6 个转移矩阵即可获得 51pts。

注意到

对于 n>799039878n>799039878 时答案为 2n7990398782^{n-799039878},剩下的分块打表即可。

不太懂是怎么注意到的。