专栏文章

UOJ Long Round #3 过了就卡卡 solution

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min1t3pw
此快照首次捕获于
2025/12/01 19:10
3 个月前
此快照最后确认于
2025/12/01 19:10
3 个月前
查看原文
我们首先写出来一个只需要 n,i,j,kn,i,j,k 四个变量的算法。
首先注意到题目保证对于不合法的下标查询,会给出 1-1。所以 nnii 可以合二为一,直接用 nn 来进行遍历。
然后发现由于这是一个排列,所以我们可以直接丢掉 p1p_1,把它当作 jj 来用,反转所有不包含 11 的环,最后再找回 nn,然后找回 p1p_1,并处理第一个数所在的环即可,于是我们就只需要 kk 这一个额外变量。
现在观察一下我们的算法发现主要空间瓶颈在于反转一个环的部分。这里我们需要 n,j,kn,j,k 三个变量来不断往后跳(ajn,nj,jk,kaja_j\leftarrow n,n\leftarrow j,j\leftarrow k,k\leftarrow a_j)。发现这一过程可以改为 swap(n,aj),swap(n,j)\text{swap}(n,a_j),\text{swap}(n,j),这样我们可以写出只需要一个额外变量进行 swap 操作的代码
现在我们来尝试掏出一个变量的临时空间,注意到 nn 有整整 3232 位,而存一个数只需要 1919 位。我们滥用一下分支跳转,根据 nn 的最高 66 位跳到对应的分支,此时 nn 就有 1919 位可用,足够我们存下 aj/ja_j/j,然后根据 nn 里面存的 nn 的低 1313 位和当前分支编号把 aj/ja_j/j 赋值为 nn,这样就原地执行了 swap(i,aj/j)\text{swap}(i,a_j/j)
于是全程只使用了免费给出的 nn代码

评论

0 条评论,欢迎与作者交流。

正在加载评论...