圆梦,个人认为题目难度:D1T1-D2T1-D1T2-D2T2-D1T3-D2T3。
这届 NOI 往前五年以内最烂稳了,往后不知道有没有更烂的。——p_b_p_b
D1T1 轻重边
Solution
听说被喷了?不过个人认为还可以。首先如果直接按照轻重边的定义写的话,不大可能写的出结果。
考虑转化问题,比如说,时间戳?
为每个点打上一个时间戳,一条边被称为轻边,当且仅当两个点的时间戳不同。
那么,操作一就可以变为一次树上路径覆盖,也就是覆盖为一个新的时间戳。
操作二拍平到序列上,就是不同颜色段个数。
初始化要在开始的时候对每个点打不同的时间戳,这样就可以使每条边都是轻边。
直接树链剖分,用线段树维护一下,时间复杂度 (O(nlog^2n))。
D1T2 路径交点
Solution
$n_1=n_k$ 与 $n_1le 100$ 的限制,不由得想到矩阵乘法。事实上,本题的解法其实比较简单,考虑将邻接矩阵乘起来并求行列式。
然后?没了。你问我为什么是对的,可以使用 LGV 引理证明。
引理:交点的奇偶性可以对应排列的奇偶性,证明吗,不会。
那么就可以直接丢到 LGV 引理上来证明了。
时间复杂度 (O(n^3))。
D1T3 庆典
Solution
发现同一个 SCC 中的点是互达的,也就是说,如果我能访问一个 SCC 中的任意一个点,则必然也可以访问其他这个 SCC 中的点。直接缩点,然后会缩出一个 DAG,随便选取一个 DAG 的生成树,其实选节点标号尽量大的是绝对对的。
现在考虑询问,容易发现每次涉及到的点很少,直接建出虚树,这个虚树的点数会很少,我们直接在上面添加上加的边。
如果,一个虚树上的点,既可以被起始点 (s_i) 到达,又可以在虚树的反树上被终止点 (t_i) 到达,则这个点被称为好点。
如果一条边的两边均是好点,那么这条边上的点都是好点。
最终的答案即为好点的权值和,时间复杂度 (O(nlog n+qlog n+sum klog n))。
注意本题的实现上需要卡常,建议不要使用倍增 LCA,如果你倍增 LCA 卡过去了那我请你抽烟。
D2T1 量子通信
Solution
容易发现字典是随机的,同时一共是 $256$ 位,最大混淆值只有 $15$。对 (256) 位的 (01) 串分段成 (16) 段,如果一个串被混淆了,那么这 (16) 段至少有一段不变,找出这一段不变的,对于这一段找出字典中的串,暴力对比即可。
好像挺一句话的,不过就这样。
D2T2 密码箱
Solution
公式其实无约分的必要,所以直接考虑分别计算分子和分母,考虑使用矩阵维护。
所以考虑矩阵刻画操作,比如说思考加上一个 (a_i) 有什么影响。
也就是说 (a'=b),(b'=a_i imes b+a)。
也就是:
那么我们就可以用矩阵刻画求答案了,考虑刻画 W
和 E
操作。
W
操作:(a_k o a_k+1):考虑构造一个矩阵 (A) 使得 (egin{bmatrix}0 & 1 \1& a_k end{bmatrix}A=egin{bmatrix}0 & 1 \1& a_k+1 end{bmatrix})。
不难构造出 (A=egin{bmatrix}1 & 1 \0& 1 end{bmatrix})
之后是 E
操作,要分 (a_k>1) 与 (a_k=1) 两种情况。
只讨论 (a_k>1) 的情况,类上,构造出给末位减一的矩阵 (egin{bmatrix}1 & -1 \0& 1 end{bmatrix})。
再进行添加,添加两个 (egin{bmatrix}0 & 1 \1& 1end{bmatrix}),乘起来得 (egin{bmatrix}0 & -1 \1& 2end{bmatrix})。
猜测另一种情况也是一样的,验证出也是一样的。
那么直接维护矩阵连乘积,矩阵反转积,矩阵翻转积,矩阵翻转反转积。
直接 FHQ 硬上,时间复杂度 (O(qlog n))。
卡常小 trick:循环展开矩阵乘法。