ZR3629 Oblivion

ZR3629 Oblivion

现有 \(n\) 个人排成一行,其中至少有一个坏人。

每个人会提供距他最近的坏人在其左侧还是右侧,若距离相同取左侧。特别低,若这个人是坏人,则提供任意信息。

给定字符集为 \(\{\tt{L},\tt{R},\tt{?}\}\) 的字符串 \(S\),\(S_i=\tt{?}\) 表示第 \(i\) 个人提供的信息未知。

求出有多少种可能的的情况,对 \(998244353\) 取模。认为两种情况不同,当且仅当某人阵营不同或给出的信息不同。

\(n \le 5 \times 10^5\),1 秒,1024 MB。

考虑钦定坏人的位置得到 DP:

  • 记 \(f_i\) 为钦定第 \(i\) 个人为坏人,只考虑 \(1 \sim i\) 的不同情况数。

  • 转移枚举上一个坏人的位置 \(j\),则 \(\forall k \in (j,i)\) 要求

    • 若 \(S_k=\tt{L}\),则 \(k-j \le i-k\)。
    • 若 \(S_k=\tt{R}\),则 \(k-j > i-k\)。
    • 若 \(S_k=\tt{?}\),则 \(k\) 无限制。

    若满足上述条件,转移 \(f_i \gets f_j\)。
    注意 \(S_i=\tt{?}\) 时,第 \(i\) 个人可以提供任意信息,\(f_i \gets f_i \times 2\)。

  • DP 初值为 \(f_i = 1\) 且 \(i\) 的左侧不含有 \(\tt{L}\)。

  • 答案为 \(f_i\) 之和且 \(i\) 的右侧不含有 \(\tt{R}\)。

对限制移项形如 \(2k \le i+j\)。定义序列 \(x_k\) 为,对 \(S_k=\tt{R}\) 的位置 \(x_k=2k\),否则 \(x_k=+\infty\)。同理定义 \(y_k\) 为对 \(S_k=\tt{L}\) 的位置 \(y_k=2k\),否则 \(y_k=-\infty\)。则转移 \(j \to i\) 成立的条件为 \(\min\limits_{k \in (i,j)} x_k \le i+j\) 且 \(\max \limits_{k \in (i,j)} y_k > i+j\)。用 ST 表优化区间最值可以做到 \(O(n^2)\) 复杂度。

我们使用分治优化 DP。对分治区间 \([l,r]\),设中点为 \(m\),我们在该层计算 \(j \in [l,m]\) 转移到 \(i \in (m,r]\) 的贡献。

预处理中心向两侧的前后缀 \(\max\) 或 \(\min\) 为

\[y_1(j)=\max_{k \in (j,m]} y_k\\ x_1(j)=\min_{k \in (j,m]} x_k\\ y_2(i)=\max_{k \in (m,i)} y_i\\ x_2(i)=\min_{k \in (m,i)} x_i \]

则转移 \(j \to i\) 成立的条件为

\[\max(y_1(j),y_2(i)) \le i+j < \min(x_1(j), x_2(i)) \]

等价于下列四个不等式同时成立:

  • \(y_1(j) \le i+j \iff i \ge y_1(j)-j\)。
  • \(y_2(i) \le i+j \iff j \ge y_2(i)-i\)。
  • \(i+j< x_1(j ) \iff i< x_1(j)-j\)。
  • \(i+j < x_2(i) \iff j < x_2(i)-i\)。

转 \(i-j\) 二维平面分析,则 \(j\) 贡献的 \(i\) 是横向线段,\(i\) 吸收的 \(j\) 是纵向线段,我们要对 \(i\) 求线段交点的权值和。将横向线段差分后,对 \(i\) 扫描线,树状数组维护 \(j\) 轴即可。

注意在分治叶节点处理 \(f_i \gets f_i \times 2\) 的转移。复杂度 \(O(n \log^2 n)\)。代码。

posted @ 2026-09-28 16:45  stripe_python  阅读(4)  评论(0)    收藏  举报