0%

JBY-practice-4

CF555E

显然对于边双可以将其变为一个强联通分量,那么直接边双缩点,就变成一棵树,直接判断下路径方向有无矛盾即可。

POI2006 LIS

对于限制,直接将原图上的边删去然后新建边即可,注意判断一下重叠的那些限制,最后在新建的图上跑欧拉回路即可

CF1770G

将括号序列看成 1 和 -1,容易发现答案是删一段前缀右括号一段后缀左括号,考虑右括号部分,对于每一个前缀最小值 \(-k\),前面的右括号里要删至少 \(k\) 个,且对于最小的那个是恰好删 \(k\) 个。将所有右括号取出来可以写出 \(O(n^2)\) 的DP \[ \begin{equation} dp_{i,j}=\left\{ \begin{aligned} dp_{i-1,j-1}+dp_{i-1,j} \quad \neg P(i)\\ dp_{i-1,j}+dp_{i-1,j+1} \quad P(i)\\ \end{aligned} \right . \end{equation} \] 其中 \(P(i)\) 为真当且仅当 i 为前缀最小值。

对于该DP可以使用分治转移,不妨令 \(l,r\) 为当前要转移的区间,\(f\) 为之前的部分得到的 \(dp\) 结果,\(Num\)\([l,r]\) 区间内 \(P(i)\) 为真的个数,那么显然对于 \(f\) 中那些下标大于 \(Num\) 的那一部分可以使用卷积快速转移,而对于下标小于 \(Num\) 的部分,不妨递归转移,即将其下放到 \([l,mid]\) 里转移并将结果传 \([mid+1,r]\) 里继续计算,对算法过程进行分析,传入 \([l,r]\)\(f\) 的长度不会超过区间长度的两倍,而卷积的另一部分长度与区间长度一致,那么可以分析出这个分治的复杂度与分治NTT相同,都是\(O(n\log^2n)\)

#### CF1779E

直接先求出所有点的出度,由竞赛图的性质,若某个点在最后的那个SCC中,那么所有出度比他大的都在其中,所以最大的点一定在,然后按出度从大往小,看一下到最后SCC中有无边,有就更新最后一个SCC即可,最后就求出了这个SCC

#### CF1779G

若最外层的三边循环,显然答案为0,否则不妨令两条出边的为 A,一进一出为 B,两条入边的为 C,显然 A 可以到达所有点,假如能够反转一些边使得 C 能到达A的话,并且 A 仍能到 B,B 仍能到 C,发现若将边权赋01,求 C 到 A 最短路吧并不会经过 A->B 的边和 B->C 的边,所以求出这条最短路,反转路径上的某些变后 A,B,C 能够互相到达,最外层强联通,并且容易发现,内部的点仍然可以与最外层强联通,此时全图强联通。

ICPC2022 Jinan B

对于一个循环节时间为\(lcm(a_1+b_1,a_2+b_2)<(a_1+b_1)(a_2+b_2)\),而对于第一个人,其改变两次状态需要穿过一个 \((a_1+b_1)\),故其改变次数不超过\(2(a_2+b_2)\),对于第二个人有同样的分析,于是一共的改变次数为线性,维护出每一段对于答案的贡献,可以用广义矩阵表示,最后利用循环节和前缀积算出所需要的矩阵就可以了

ICPC2022 Jinan L

考虑求出所有可能成为答案的点对。

对于点对距离问题,考虑分治,对于一块分治,其中距离可以表示为 \(dis_{x,y} \leq d_x+d_y\),由于不等的情况下只会在同一个连通块出现,可以直接用 \(d_x+d_y\) 表示,按 \(d_x\) 排序后对于一个点 \(x\),只需考虑在前面的点组成的点对,发现如果存在 \(x<y<z\),且 \(d_y,d_z\leq d_x\),那么有 \(x,z\) 不可能成为答案,因为当区间包含点对 \((x,z)\) 时,其包含点对 \((y,z)\)\(dis_{x,z} \geq dis_{y,z}\),所以对于点 \(x\) 只需要考虑比他小的点的集合中他的前驱和后继,所以一共只会有 \(O(n\log n)\) 个点对有可能成为答案,对于所有可能的点对和询问做扫描线就可以解决问题。

APC001F

显然有解为每个点到根权值为该点所连的边的权值的异或和,考虑对于若干这样的链,发现每 k 条这样到根的异或和为0的操作,他可以变化为 k-1条链,那么问题就办成了选出若干异或和为0的操作集合,最多能选出几个。显然 0 单独放,其他每种尽量两个两个合并,所以最后就只有若干种权值有 1 个,剩下的没有,由于权值很小为 0-15,直接枚举自己求出最多可以凑出几个集合即可复杂度为 \(O(3^{16}+n)\)

[USACO22DEC] Strongest Friendship Group G

一开始先取联通块最大,再逐渐增大最小边数的限制,因为边数不能增加,所以比限制小的点直接删除,不断重复直到剩下的都满足这个边数限制,并记录每个限制删除了那些点。然后倒着往回加点,维护连通块大小并计算贡献