0%

2026 杭电暑期多校 8-1010-合并之后字典序就变小了

题目大意

合并之后字典序就变小了

时间限制:2000 / 1000 MS(Java / 其他)
内存限制:524288 / 524288 KB

给定一个长度为 NN 的数组 AA,其中每个元素均属于 {0,1,2}\{0,1,2\}

你可以执行任意多次以下操作:

选择两个相邻元素 Ai,Ai+1A_i, A_{i+1},将它们删除,并在原位置插入 (Ai+Ai+1)mod3(A_i + A_{i+1}) \bmod 3

每次操作会使数组长度减少 11

定义 f(A)f(A) 为通过若干次(可以是 00 次)操作能够得到的字典序最小的数组。

对于数组 BB,定义

val(B)=i=1BBi3i1\operatorname{val}(B)=\sum_{i=1}^{|B|} B_i \cdot 3^{\,i-1}

给定数组 AA,求

L=1NR=LNval(f(A[L,R]))\sum_{L=1}^{N}\sum_{R=L}^{N}\operatorname{val}\bigl(f(A[L,R])\bigr)

998244353998244353 取模后的结果。其中 A[L,R]A[L,R] 表示子数组 [AL,AL+1,,AR][A_L, A_{L+1}, \ldots, A_R]

对于两个不同的数组 P,QP, Q,若满足以下任意一条,则称 PP 的字典序小于 QQ

  • PPQQ 的前缀;

  • 存在位置 ii,满足 Pi<QiP_i < Q_i,且对所有 j<ij < i 都有 Pj=QjP_j = Q_j

第一行一个整数 TT,表示测试数据组数。

对于每组测试数据:

  • 第一行一个整数 NN

  • 第二行 NN 个整数 A1,A2,,ANA_1, A_2, \ldots, A_N

数据范围:

  • 1N2×1051 \le N \le 2 \times 10^5

  • 0Ai20 \le A_i \le 2

OJ 中只有一个正式测试点,该测试点满足 T=10000T = 10000N=2×106\sum N = 2 \times 10^6

对于每组测试数据输出一行,表示所有子数组对应的 val(f(A[L,R]))\operatorname{val}(f(A[L,R])) 之和对 998244353998244353 取模后的结果。

1
2
3
4
5
6
7
3
2
2 1
3
1 1 2
4
2 1 0 2
1
2
3
3
9
30

第一组数据A=[2,1]A = [2, 1],共 33 个子数组。

子数组 ff val\operatorname{val}
[2][2] [2][2] 22
[1][1] [1][1] 11
[2,1][2,1] [0][0] 00

其中 [2,1][2,1] 合并后得到 [(2+1)mod3]=[0][(2+1)\bmod 3] = [0],字典序小于 [2,1][2,1]。总和为 2+1+0=32+1+0=3

第二组数据A=[1,1,2]A = [1,1,2],共 66 个子数组。

子数组 ff val\operatorname{val}
[1][1] [1][1] 11
[1][1] [1][1] 11
[2][2] [2][2] 22
[1,1][1,1] [1,1][1,1] 44
[1,2][1,2] [0][0] 00
[1,1,2][1,1,2] [1][1] 11

其中 [1,1][1,1] 若合并会得到 [2][2],字典序反而更大,故不操作;[1,1,2][1,1,2] 可以一路合并为 [1][1],它是所有可达数组中字典序最小的。总和为 1+1+2+4+0+1=91+1+2+4+0+1=9

第三组数据A=[2,1,0,2]A = [2,1,0,2],共 1010 个子数组,val\operatorname{val} 依次为

2,  1,  0,  2,  0,  1,  6,  0,  0,  182,\;1,\;0,\;2,\;0,\;1,\;6,\;0,\;0,\;18

总和为 3030。例如整个数组 [2,1,0,2][2,1,0,2] 的字典序最小结果为 [0,0,2][0,0,2],其 val=0+03+29=18\operatorname{val} = 0 + 0\cdot 3 + 2\cdot 9 = 18

思路讲解

队友赛时过了,我就不看了。

AC代码

心路历程(WA,TLE,MLE……)