NOI 2021 部分题目题解

最近几天复盘了一下NOI 2021,愈发发觉自己的愚蠢,可惜D2T3仍是不会,于是只写前面的题解

Day1 T1

可以发现,每次相当于将 (x o y) 染上一种全新颜色,然后一条边是重边当且仅当两端有颜色且相同,于是就可以使用树链剖分维护了。

复杂度 (Theta(nlog^2n))

Day1 T2

可以发现,当 (n_i) 都相同的是,答案就是邻接矩阵行列式的积,也即是邻接矩阵积的行列式。

拓展发现,(n_i) 不同的时候依旧适用,不过不会证明。

Day1 T3

首先可以发现,在缩点之后一定存在一种树形结构使得不改变连通性,因为假设存在 (z o x,y o x,z o y),那么 (z o x) 是不需要的。所以在构造树的时候可以选一个入度为 (0) 的点开始,然后每次儿子从 scc 序大的开始。

假设已经建好了树,可以发现 (k=0) 时有解的话就是 (x o y) 上链上点的大小之和,(k=1) 的话需要分类讨论,(k) 更大时显然分类讨论不是很好搞。

发现假设我们定义“好点”为新增边的端点中既能从 (s) 到达又能到 (t) 的点(合法情况下包括 (s,t)),那么一个点合法当且仅当祖先中有“好点”,子树中有“好点”。

那我们就可以建出虚树,然后算贡献了。(然而似乎可以不用建出虚树)。

Day2 T1

不难发现分成 (16) 段的话,如果有解那么解的方案一定有一段完全相同,然后你发现随机情况下一段最多有 (7) 个左右,暴力判就好了。算差异的话可以用 __builtin_popcount (Theta(1)) 计算。

Day 2 T2

首先可以看出并不需要除以 (gcd)

可以发现如果 (a_i) 是确定的,那么:

[egin{bmatrix} a_i & 1\ 1 & 0 end{bmatrix}]

从右往左算的积的 ((0,0)) 位和 ((0,1)) 位就是答案。

考虑 W 操作的影响,你发现:

[egin{bmatrix} 1 & 1\ 0 & 1\ end{bmatrix} imes egin{bmatrix} a_i & 1\ 1 & 0 end{bmatrix} = egin{bmatrix} a_i+1 & 1\ 1 & 0 end{bmatrix} ]

所以就相当于在后面增加一个

[egin{bmatrix} 1 & 1\ 0 & 1 end{bmatrix} ]

的矩阵。

考虑 E 操作,不难发现两种情况其实操作下来等价,所以我们只需要考虑第二种情况。实际上就是增加:

[egin{bmatrix} 1 & 1\ 1 & 0 end{bmatrix} egin{bmatrix} 1 & 1\ 1 & 0 end{bmatrix} egin{bmatrix} 1 & -1\ 0 & 1 end{bmatrix} ]

又因为矩阵有结合律,所以就相当于增加:

[egin{bmatrix} 2 & -1\ 1 & 0 end{bmatrix} ]

所以用平衡树维护就好了。需要卡常的话可以把矩阵乘法那里手写而非循环形式。

原文地址:https://www.cnblogs.com/Dark-Romance/p/15113230.html