1 条题解

  • 0
    @ 2025-8-24 22:34:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar AsunderSquall
    The cruelest fate is to have hope and see it crushed before your eyes.

    搬运于2025-08-24 22:34:36,当前版本为作者最后更新于2021-11-17 19:51:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    逆转比特

    题意

    一个点在长为 nn 的 只含有 0/1 的序列上随机游走(下标从 1 开始),点的初始坐标为 pp,重复进行以下操作:

      1. 当序列全为一种字符时,停止操作;
      1. 记点当前位置 pp,等概率随机选择一个点 qq,把点移动到 qq,将 qq 处的字符的取反,总代价加上 f(pq)f(|p-q|),这里 f(x)=Ax2+Bxf(x)=Ax^2+Bx,其中 A,BA,B 是两个给定常数;
      1. 回到第一条。

    你需要进行 qq 次修改,具体而言,每次修改包括

      1. 将序列第 idx\mathit{idx} 位的 0/1 翻转;
      1. 查询初始坐标为 pp 时,停止操作后的期望代价。

    注意,一旦修改一直有效

    你需要输出 qq 次询问期望代价模 998244353998244353 的结果的异或和。

    题解

    下述先考虑单组询问, 用 ss 表示 01 串,pp 表示点的位置。

    算法一

    我会暴力高斯消元!

    一个显然的做法类似随机游走,在 n2nn 2 ^ n 种状态(01 串形态与点的位置)中列出线性方程组,直接高斯消元解出变量,这样做复杂度 O(8nn3)O(8^nn ^ 3)

    期望得分:5。

    算法二

    我会期望的线性性!

    上述做法很大的缺陷是状态数太多。注意到 ii 走到 jj 的代价是固定的,并且只与 ij|i-j| 有关,枚举所有的 iji\neq j 计算 iji\rightarrow j 的期望次数 EijE_{i\rightarrow j}

    $$ans=\sum_{i=1}^n\sum_{j=1}^n[i\neq j]f(|i-j|)E_{i\rightarrow j} $$

    对于一组i,ji,j,有效信息只有

    • r=k=1n[si=sk]r = \sum_{k = 1} ^ n [s_i = s_k]
    • u=[p=i]u = [p = i]
    • v=[si=sj]v = [s_i = s_j]

    有效信息可用三元组 (r,u,v)(r,u,v) 表示,只有 O(n)O(n) 种,直接高斯消元,一组 (i,j)(i,j) 就可以 O(n3)O(n^3)。冷静一下,所有 iji\neq j 不需要分开求,合起来列方程求解就可以,此时总复杂度 O(n3+qn2)O(n^3+qn^2)

    按照点移到 i,ji,j,其他位置的 00,其他位置的 11 四种情况分类讨论转移及系数,具体转移如下:

    $$\begin{aligned} f(a, 0, 0)&= \frac{1}{n} f(n - a + 1, 1, 1) + \frac{a - 1}{n} f(a - 1, 0, 0)\\ &+ \frac{1}{n} f(a + 1, 0, 1) + [a < n] \frac{n - a - 1}{n} f(a + 1, 0, 0)\\ f(a, 1, 0)&= \frac{1}{n} f(n - a + 1, 1, 1) + \frac{a - 1}{n} f(a - 1, 0, 0)\\ &+ \frac{1}{n} (f(a + 1, 0, 1) + 1) + [a < n] \frac{n - a - 1}{n} f(a + 1, 0, 0)\\ f(a, 0, 1) &= \frac{1}{n} f(n - a + 1, 1, 0) + \frac{1}{n} f(a - 1, 0, 0)\\ &+ [a > 1]\frac{a - 2}{n} f(a - 1, 0, 1) + \frac{n - a}{n} f(a + 1, 0, 1)\\ f(a, 1, 1) &= \frac{1}{n} f(n - a + 1, 1, 0) + \frac{1}{n} (f(a - 1, 0, 0) + 1)\\ &+ [a > 1]\frac{a - 2}{n} f(a - 1, 0, 1) + \frac{n - a}{n} f(a + 1, 0, 1)\\ \end{aligned} $$

    (其实这些方括号都是不需要的,因为这些不合法的状态前面系数都为 00,不妨设其值也为 00

    由于要做大小为 4n×4n4n \times 4n 的矩阵的高斯消元,所以常数很大不能忽略。

    期望得分:23。

    算法三

    我会观察性质!

    仔细观察,容易发现,在 aa 不为 nn 的时候,f(a,1,b)=f(a,0,b)+1nf(a, 1, b) = f(a, 0, b) + \frac{1}{n},由此 (r,v)(r,v) 才是有效的,只有 2n2n 种。

    这个观察非常容易所以没有给这一档部分分。(除非你是松怪用它过了 Subtask 3

    $$\begin{aligned} f(a, 0)&= \frac{1}{n} f(n - a + 1, 1) + \frac{a - 1}{n} f(a - 1, 0)\\ &+ \frac{1}{n} f(a + 1, 1) + \frac{n - a - 1}{n} f(a + 1, 0) + \frac{1}{n ^ 2}\\ f(a, 1) &= \frac{1}{n} f(n - a + 1, 0) + \frac{1}{n} f(a - 1, 0)\\ &+ \frac{a - 2}{n} f(a - 1, 1) + \frac{n - a}{n} f(a + 1, 1) + \frac{1}{n ^ 2}\\ \end{aligned} $$

    特别的,当 a=1a=1 时,没有 1n2\frac 1 {n^2} 项。

    g(a)=f(a,0)f(a,1)g(a) = f(a, 0) - f(a, 1),显然只有 1<a<n1<a<n 的时候该式有意义。
    但是考虑到,式子中涉及到 g(1)g(1)g(n)g(n) 前面的系数均为 00,所以不妨设其为 00。 两式相减得

    ng(a)+g(na+1)=(a2)g(a1)+(na1)g(a+1)(1<a<n)ng(a)+g(n-a+1)=(a-2)g(a-1)+(n-a-1)g(a+1)(1<a<n)

    可以证明 1<a<n,g(a)=0\forall 1<a<n,g(a)=0


    证明:

    g(k)g(n+1k)g(k)-g(n+1-k)S(k)S(k)

    考察 a=ka=ka=n+1ka=n+1-k 的情况,注意到

    $$\begin{aligned} ng(k)+g(n+1-k)&=(k-2)g(k-1)+(n-1-k)g(k+1)\\ ng(n+1-k)+g(k)&=(k-2)g(n+2-k)+(n-1-k)g(n-k) \end{aligned} $$

    两式相减得

    (n1)S(k)=(k2)S(k1)+(n1k)S(k+1)(n-1)S(k)=(k-2)S(k-1)+(n-1-k)S(k+1)

    稍微整理得好看一点

    (nk1)S(k+1)(k1)S(k)=(nk)S(k)(k2)S(k1)(n-k-1)S(k+1)-(k-1)S(k)=(n-k)S(k)-(k-2)S(k-1)

    A(k)=(nk)S(k)(k2)S(k1)A(k)= (n-k)S(k)-(k-2)S(k-1),我们得到 A(k+1)=A(k)A(k+1)=A(k)

    考虑 (n1)S(2)=(n3)S(3)(n-1)S(2)=(n-3)S(3),有

    A(3)=(n3)S(3)S(2)=(n2)S(2)A(3)=(n-3)S(3)-S(2)=(n-2)S(2) (nk)S(k)=(n2)S(2)+(k2)S(k1)(n-k)S(k)=(n-2)S(2)+(k-2)S(k-1)

    可以看出所有 S(a)S(a) 的正负性相同。

    考虑到 S(a)+S(n+1a)=0S(a)+S(n+1-a)=0,因此只能所有 S(a)=0S(a)=0。 由此证明了 1<a<n,g(a)=g(n+1a)\forall 1<a<n,g(a)=g(n+1-a)

    思考一个问题,为什么我们列出了一个期望的方程丢进高斯消元里,他一定有解?

    因为他的解确实存在,而且我们给出的方程可以描述整个问题。

    $$\begin{aligned} ng(a)+g(n-a+1)&=(a-2)g(a-1)+(n-a-1)g(a+1)\\ (n+1)g(a)&=(a-2)g(a-1)+(n-a-1)g(a+1)\\ g(a)&=\dfrac{(a-2)g(a-1)+(n-a-1)g(a+1)}{n+1} \end{aligned} $$

    这东西看着就很像一个期望的方程组,我们随便给他赋一个组合意义。
    比如一个人在 2n12 \sim n-1 的数轴上随机游走,然后有一定概率往左/往右/螺旋升天。
    这个人走到任何一个位置都会获得 00 的贡献,问从某个位置出发的期望贡献和,答案显然是 00

    不过其实也可以大眼观察法看出来。


    有效状态压缩至 nn 个,设 ha=f(a,0)=f(a,1)h_a = f(a, 0) = f(a, 1) 则有:

    $$h_a = \frac{1}{n} h_{n - a + 1} + \frac{a - 1}{n} h_{a-1} +\frac{n - a }{n} h_{a + 1} + \frac{1}{n^2} $$

    或者也可以对 gg 高斯消元,再回带回 ff 中高斯消元,相当于是解 22n×nn \times n 的方程组,常数会大一点,但应该能过 Subtask 3。

    期望得分:35。

    算法四

    考虑一个常见技巧,如果 hah_a 只与 ha1h_{a-1}ha+1h_{a+1} 有关,可以把所有变量表示为 hi=kih1+bih_i=k_ih_1 + b_i 的形式,列出一个等式求出h1h_1,从而推出全部 上面的式子中 hah_a 还与 hn+1ah_{n+1-a} 有关,有关系的点连边之后形成梯子状结构。
    以下是 n=8n=8 时的一个例子:


    类似上面做法,设 h1=x,hn1=yh_1=x, h_{n-1}=y,将 hih_i 表示为 Ax+By+CAx + By + C 的形式,列出两个线性无关的额外方程解出 x,yx, y

    值得注意的是这个方法在 n2n \le 2 的时候会出问题,这就是为什么数据范围中 n3n \ge 3

    预处理已经可以线性,考虑询问。

    $$\begin{aligned} ans &= \sum_{i = 1} ^ n \sum_{j=1, j \neq i}^n f(|i - j|) \cdot E_{i\rightarrow j}\\ &= \sum_{i = 1} ^ n \sum_{j = 1, j \neq i} ^ n f(|i - j|) \cdot ([p = i]\frac{1}{n} + h(\sum_{k = 1} ^ n [s_i = s_k])) \end{aligned} $$

    需要注意如果 aa 全部相等需要加特判,由于大数据随机不到所以选择了添加子任务依赖关系。

    预处理 di=j=1nf(ij)d_i=\sum_{j=1}^n f(|i-j|),单次询问做到 O(1)O(1) 不成问题。

    至此,复杂度 O(n+q)O(n + q),期望得分:100。

    • 1

    信息

    ID
    7207
    时间
    1000~2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者