题解 P8145【[JRKSJ R4] kth】

$\text{Link}$

题意

给你一个 $n$ 阶排列 $p$,任选一个起始点,走 $m-1$ 步,并将走过的所有数按走到的顺序写下,形成一个长度为 $m$ 的序列。求出所有以上面的方法生成的序列中字典序第 $k$ 小的序列的所有元素的和。

$n\le2\times 10^7$,$m,k\le10^{18}$.

思路

题出得太强啦!

令 $\displaystyle r_i=\sum_{j=1}^nj[p_j=i]$,即 $p_i=j\to r_j=i$。

考虑 $k=1$ 的部分分。

起始点肯定是 $r_1$,每次走肯定走的是相邻的点中较小的值。这样是 $\Theta(n+m)$ 的,不太行。你考虑从 $r_1$ 走出一步后下一步会走回 $r_1$,所以可以 $\Theta(1)$ 计算答案。

现在 $k$ 没有限制,考虑怎么做。

枚举起始值 $i$,计算从 $r_i$ 开始走 $m-1$ 步的方案数 $t$ 可以 $\Theta(nm)$ 算出。具体地,定义 $f_{i,j}$ 表示从 $j$ 出发走 $i$ 步的方案数,$f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1}$。可以通过和 $k$ 的大小关系决定起始点。之后每一次决策都可以 $\Theta(nm)$ 计算,时间复杂度 $\Theta(nm^2)$,不太行。

你发现 $f$ 是不变的,于是可以先预处理,时间复杂度降至 $\Theta(nm)$,还是不太行。

$f$ 的值很大,当 $f$ 的值大于 $10^{18}$ 时,可以用 $-1$ 表示,因为它一定大于 $k$,诶,好像 $f$ 的值很容易是 $-1$。

事实上,$f$ 只有前 $s=\Theta(\log k)$ 层不是 $-1$,我们可以考虑除了最后 $s$ 步需要决策,其余全部走最小值。考虑前面的部分,一定是走到某个地方开始在 $i$ 和 ${i+1}$ 之间反复走。

可以证明:(默认从起始点向左走,向右走的情况类似)

$i=1$ 的情况平凡。

则满足 $p_{i-1}>p_{i+1}$,$p_i<p_{i+2}$ 时会开始反复走。可以走到 $i$ 说明后者成立,所以为了不满足反复走的结论,前者必不成立,所以会走向 $i-1$,最终成为 $i=1$ 的情况。

所以我们可以 $\Theta(n)$ 走完前面的步数,最后 $s$ 步按照决策来走,时间复杂度 $\Theta(n\log k)$,还是不行。

时间复杂度瓶颈在于预处理 $f$ 上,我们可以发现,若 $i\in(s,n-s)$,不需要考虑边界问题,则 $f_{i,j}=2^j$。而对于 $i\in[1,s]\cup[n-s,n]$,走 $s$ 步之后只会在 $[1,2s]\cup[n-2s,n]$ 中,需要决策的点只有 $4s$ 个,只用转移它们即可。

至此,我们做到了时间复杂度 $\Theta(n+\log^2k)$。比 $\texttt{dqstz}$ 题解少了一个 $\log k$。

再见 qwq~

posted @ 2022-02-15 18:46  ffffyc  阅读(11)  评论(0)    收藏  举报  来源