Live2D

NOI 2021 部分题目题解

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

Day1 T1

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

复杂度 \(\Theta(n\log^2n)\)

Day1 T2

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

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

Day1 T3

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

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

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

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

Day2 T1

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

Day 2 T2

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

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

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

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

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

\[\begin{bmatrix} 1 & 1\\ 0 & 1\\ \end{bmatrix} \times \begin{bmatrix} a_i & 1\\ 1 & 0 \end{bmatrix} = \begin{bmatrix} a_i+1 & 1\\ 1 & 0 \end{bmatrix} \]

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

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

的矩阵。

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

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

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

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

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

posted @ 2021-08-07 21:03  Dark_Romance  阅读(309)  评论(0编辑  收藏  举报