SD 二轮省集
Day 0
试机赛 T1
给你一张 \(n\) 个点 \(m\) 条边的无向图,你需要添加若干条边使得这张图无重边自环且边双连通。求方案数。
\(n\leq 5\times 10^3,m\leq 10^6\)。
先缩边双缩成一棵树,转化为添加一些非树边使得每条边都被包含进一个环。考虑容斥,钦定一些边一定不被包含,那么树就被分成了若干个连通块,每个连通块内可以乱连。把容斥系数带进去,容易用 DP 统计出方案数。
复杂度是树形背包的 \(O(n^2)\)。
试机赛 T2
给你一张 \(n\) 个点 \(m\) 条边的 DAG,每条边是黑色或者白色。\(q\) 次询问 \(a,b,x\),问如果把黑边边权设为 \(a\),白边边权设为 \(b\),\(1\) 到 \(x\) 的最短路是多少。
\(n\leq 5\times 10^4,q\leq 10^5\)。
考虑一条路径经过 \(x\) 条黑边 \(y\) 条白边,则对于一个终点 \(x\),有用的 \((x,y)\) 只可能在下凸壳上,证明画个图理解一下。
因为是 \(n\times n\) 的平面,凸壳上只有 \(O(n^{\frac{2}{3}})\) 个整点,所以若能预处理出每个点的凸包,则可以直接暴力查询。
考虑预处理凸包,按照拓扑序处理,把其前驱凸壳合并进当前凸壳即可。
试机赛 T3
给你一个长为 \(n\) 的排列,定义一个序列的价值为使用邻项交换能使其变为单峰序列的最小次数。对于每个前缀求出这个前缀的价值。
\(n\leq 5\times 10^5\)。
考虑整个序列的最小值,它一定在序列的两端。让其往最近的那端交换过去,再递归成子问题,这样一定不劣。设 \(a_i\) 左边比它大的数的个数为 \(l_i\),右边为 \(r_i\),则每个数对价值的贡献就是 \(\min\{l_i,r_i\}\),这样可以 \(O(n\log n)\) 求整个序列的价值。
对每个前缀算,考虑增量。一个数的加入可能会让之前的数的 \(r_i+1\),而 \(l_i\) 不会变。于是可以得到一个数如果本来就往左边走那么在末尾加入一个数后它一定还往左边走,如果这个数往右边走那么它只可能存在一个时刻从往右边变成往左边。于是在值域上开一棵线段树维护其 \(l_i-r_i\) 的值,还没出现的数或者已经确定往左走的数就设成 \(\infin\),只要支持区间 \(-1\) 或者区间查最小值位置就行了。
复杂度 \(O(n\log n)\)。
Day 1
模拟赛 T1
给定一棵 \(n\) 个点的树,和一个阈值 \(k\)。如果树上 \(\operatorname{dis}(u,v)\geq k\),那么在新图上连接点 \(u,v\)。
有 \(q\) 次询问,每次给出 \(x,y\),问新图上 \(x,y\) 是否连通,如果连通,求出其最短距离。
\(n,q\leq 10^5\)。
首先拎出树的直径,设端点为 \(L,R\)。如果 \(x,y\) 在新图上连通,那么必定存在一个路径 \(x\to L\to R\to y\) 或 \(x\to R\to L\to y\)。
于是可以得到判断是否连通的方法,以及答案不超过 \(3\)。考虑挨个判断。
答案为 \(1\) 直接求距离即可,只需要判答案为 \(2\),剩下就是答案为 \(3\) 的情况。设 \(x\) 到直径上的第一个点为 \(u\),\(y\) 的为 \(v\),那么经过一些调整法可以证明,如果答案为 \(2\),那么必定存在 \(u\to v\) 路径上往外走的一个点 \(z\),满足 \(x\to z\to y\) 是合法路径。
现在需要找出这个 \(z\)。要同时满足两条限制不是很好做,考虑拆开。找到 \(x\to y\) 的中点。如果 \(z\) 在左边且 \(\operatorname{dis}(x,z)\geq k\),那么一定有 \(\operatorname{dis}(y,z)\geq k\),反之亦然。所以直接预处理出每个点往外的最远距离 \(len_i\),用 ST 表查 \(len_i+i\) 和 \(len_i-1\) 的区间最大值即可。
当然如果想更简单一点,注意到错解不优,记录 \(len_i+i\) 的前缀 \(\max\) 和 \(len_i-1\) 的后缀 \(\max\) 即可。
模拟赛 T2
非常抽象
模拟赛 T3
非常困难
LOJ6669
先问一遍到 \(1\) 的距离问出每个点的深度,按深度挨个加。
考虑加一个点时,给当前树重剖,问当前点跟当前重链链底的距离,能得到当前点从哪个地方走出了当前重链,相当于走了一条轻边。显然对于一个点只会问 \(\log\) 次,并且跑不满。
UOJ618
显然 \(j\) 为奇数时答案为 \(1\)。偶数时相当于要选出两个类似子树的结构,满足其大小大于等于 \(\frac{j}{2}\),最大化这两个子树中间的链长。
对于一个 \(j\),若 \(x\) 能作为这条链的端点,那么一定满足以这个点为根时,去掉最大的那棵子树,剩余的点数量大于等于 \(\frac{j}{2}\)。于是从大到小枚举 \(j\),就变成了加点求直径问题。
CF803E
- 若图中有环,则直接给环全填 \(1\) 即可,所以转化为森林。
- 若有两个连通块赋权了,则一定可以删到只剩一个连通块,所以转化为一棵树。
- 若存在一个至少四度点,则给中间点填 \(2\),旁边四个点填 \(1\),则满足,所以图中只有 \(1,2,3\) 度点。
- 若存在两个三度点,则给这两个点以及之间的路径填上 \(2\),旁边的填上 \(1\) 即可,所以最多有一个三度点。
- 若为一条链,感受一下可知无解,所以一定是三度点挂链的情况。
- 写个暴力可以知道,有解当且仅当三条链长度分别大于 \(2,2,2\),\(1,3,3\) 或 \(1,2,5\)。
Day 2
模拟赛 T1
给定长为 \(n\) 的序列 \(b_i\),求所有长为 \(n\) 的序列,满足 \(0\leq a_i\leq b_i\),的 mex 之和。
\(n\leq 5\times 10^3,0\leq b_i\leq 10^9\)。
先把 mex 的贡献拆开,现在要对于每个 \(k\) 求有多少个序列满足 \([0,k]\) 的数都出现了,答案就是它们的和。
套路地,\(0\sim k\) 所有数都出现了可以容斥成钦定一些数不出现。若钦定 \(x\) 个数不出现则容斥系数为 \((-1)^x\)。
考虑 DP 出来这个东西。设 \(f_{i,j}\) 表示值域 \([0,i]\) 中钦定了 \(j\) 个数没出现,\(a\) 的方案数。每个数的方案满足乘法原理所以这个是容易 DP 的,但是需要地推出 \(g_{i,j}\) 表示如果在 \([0,i)\) 中钦定了 \(j\) 个数,值在 \([i,\infin)\) 中的数的方案数。
这样得到了一个 \(O(nV\log V)\) 的做法。
考虑到序列的 mex 不超过 \(n\) 则可以优化成 \(O(n^2\log V)\),把 \(\log V\) 去掉只要同时递推出 \(g_{i,j}\) 的逆元即可。
模拟赛 T2
非常线性代数。
模拟赛 T3
非常转置原理。
CF1514E
连通性问题考虑缩强连通分量。竞赛图缩完之后一定是一条链。首先考虑怎么求出图上的一条哈密顿路径。
考虑纳入。假设当前已经找到一条链 \(u_1\to u_2\to \cdots \to u_k\),要把 \(x\) 纳入这条链。如果 \(x\to u_1\) 或者 \(u_k\to x\) 存在,直接接上就行,否则中间一定存在一个 \(i\) 满足 \(u_i\to x\) 和 \(x\to u_{i+1}\) 存在,二分出这个 \(i\) 直接加进来就行。
然后再找这条链上的强连通分量,对于每个 \(u_i\) 问其到 \(u_1\sim u_{i-1}\) 有没有连边,如果有就合并即可。
CF1535F
显然如果存在一种方案,则答案至多为 \(2\)。
先把字符组成相同的字符串拎出来做。\(f(a,b)=1\) 当且仅当 \(a\) 与 \(b\) 去掉最长公共前缀和最长公共后缀之后其中一个字符串有序,考虑枚举这段有序的子串。
建出正 Trie 和反 Trie,就是要求两棵子树的交。求出一个字符串所对应的在正、反 Trie 中的 dfn,则子树交相当二维数点。\(O(|S|\log n)\)。
Day 3
不想写。感觉烂题。
讲课是网络流与对偶,以后补。
Day 4
模拟赛 T1
给定 \(n,m\),问有多少个 \(n\) 的排列满足任意相邻两项的和不等于 \(m\) 或 \(m+1\)。
\(m\leq 10^7,n\leq 10^9,m\leq n\)。
考虑 \(m\) 或 \(m+1\) 这个条件的特殊性。\(m\) 不能与 \(1\) 相邻,\(1\) 不能与 \(m-1\) 相邻,\(m-1\) 不能与 \(2\) 相邻……这样不能相邻的限制形如一条链。
考虑容斥,钦定 \(1\sim m\) 中有 \(k\) 对相邻的不合法(容斥系数为 \((-1)^k\)),也就是说那条链被分为 \(m-k\) 条子链。这些子链中长度大于 \(1\) 的可以选择两种方向排布,设 \(f_{i,j}\) 为长度为 \(i\) 的链被分为 \(j\) 条子链后排布的方案数,则答案为:
\(n\) 很大,要算 \((n-k)!\),可以考虑分段打表先把 \(n!\) 算出来,然后循环的过程中每次除掉 \(n-k\) 即可。现在任务是算 \(f_{i,j}\)。
设 \(f_{i,j,0/1}\) 为长度为 \(i\) 的链划分为 \(j\) 条子链,末尾点 是/不是 与前面一个点在一条链里的的方案数,转移有:
原 \(f_{i,j}\) 就是 \(f_{i,j,0}+f_{i,j,1}\)。可以做到 \(O(m^2)\)。太慢了。
考虑直接写出答案的生成函数。先写出一条链的生成函数:
那么根据组合意义,答案为:
后面那个和式是一个卷积形式,NTT 直接碾可以做到 \(O(m\log m)\)。哦碾不过去,要写三模 NTT。不用谢。
然后考虑线性做法。设 \(G(x)=\sum_{i=0}^m(i+n-m)!(-1)^{m-i}x^i\),则答案为 \([x^m]G(F(x))\)。其中 \(G(x)\) 为幂函数的和,是 D-finite 的,而 \(F(x)\) 是代数函数,所以 \(G(F(x))\) 也是 D-finite 的,可以解出其系数的整式递推。
所以有了一个 \(O(m)\) 的解法。
CF1764H
假设当前操作区间为 \([s,t]\),考虑到初始时每个位置的颜色互不相同,所以可以维护 \(c_i\) 表示颜色 \(i\) 最后存在的时刻,答案就是有多少 \(i\) 满足 \(c_i\geq t\)。
如何动态维护 \(c_i\)?考虑倒序操作。在前面加一个操作 \([l,r]\) 会把 \((l,r]\) 的 \(c_i\) 覆盖为 \(l-1\),\(c_l\) 会变成 \(c_{l\sim r}\) 的最大值。于是直接颜色段均摊 + BIT 即可解决。
QOJ9632
考虑把每个连通块的直径找出来。给树标上 dfn,如果断 \(k\) 条边,那么所有形成的连通块的 dfn 区间总数是 \(O(k)\) 的。所以以 dfn 为下标用线段树维护直径就可以做到均摊 \(O(\log n)\) 查询连通块直径。
找出直径之后,\(x\) 到所有点距离 \(\leq r\) 就是到两个直径端点的距离 \(\leq r\),也就是 \(x\) 在直径中点的 \(r-\frac{d}{2}\) 邻域中。可以用点分树处理。
Day 5
模拟赛 T1
给定 \(n\),\(q\) 次询问 \(m\),求满足以下条件的序列 \(a\) 个数:
- 长度为 \(m\)。
- \(a_i\mid n\)。
- \(\forall 1\leq i<m,\gcd(a_i,a_{i+1})>1\)。
\(n\leq 10^{16},q\leq 150,m\leq 10^{18}\)。
先给 \(n\) 分解质因数,找出它的质因子集合设为全集,那么有 \(a_i\) 的质因子集合是全集的子集。\(\gcd(a_i,a_{i+1})\) 相当于两个集合交不为空。
于是现在有了一个 \(O(q2^{3w(n)}\log m)\) 的矩乘做法。过不去。
此时可以写个线性递推了,但是超纲。。。
考虑压缩状态,如果两个质因子在 \(n\) 中次数相同,它们两个不用互相区分,只需要记录有多少个出现了就行。这样经过搜索,状态数能大大压缩,大概在 \(140\) 级别!设其为 \(T\)。于是复杂度为 \(O(qT^3\log m)\)。
最后使用经典向量乘矩阵 trick 优化成 \(O(qT^2\log m)\)。
模拟赛 T2 P8334
先差分贡献,设 \(ans_i\) 表示最小值 \(\geq i\) 的概率和,则答案为 \(\sum_i ans_i\)。
差分完了之后,如果当前要计算 \(ans_k\),相当于点权 \(\geq k\) 的点能走,\(<k\) 的不能走。根据 dfs 的性质,如果进入一个含有不能走的点的子树且终点不在这个子树就完蛋了,所以中途只能经过全能走的子树。
现在要解决,如果当前在一个点,有 \(n\) 个全能走子树,\(m\) 个不能走子树,还有一个终点在的子树。随机选一个子树进去,选到不能走的就完蛋了,完蛋之前选到终点的子树就赢了,赢的概率是多少?
如果你有敏锐的数学直觉,可能会猜测概率为 \(\frac{1}{m+1}\),因为选一个能走的子树相当于啥也没干,选一个不能走的就直接完蛋了,所以一定要先选终点子树。如果你没有,就用代数推导(反正我没有):
知道了这个之后就能简单设计 DP 了。设 \(f_u\) 表示 \(u\) 到子树内点经过的最小值 \(\geq k\) 的期望点数,\(g_u\) 为 \(u\) 子树内答案,\(c_u\) 为不能走的子树个数,\(d_u\) 表示这个子树里是否全能走,则转移:
现在可以把整个题做到 \(O(nV)\),离散化可以做到 \(O(n^2)\)。
从大到小枚举 \(k\),则每次相当于把一些点变成可以走的,DDP 大力维护即可。
P10181
首先线段树优化 DP 可以做到 \(O(n^2\log n)\)。
注意到决策单调性,以及这个东西关于 \(k\) 是凸的。
所以可以 wqs 二分。做到 \(O(mn\log n\log V)\)。
考虑优化。注意到二分的斜率最大为 \(n\)。设一个阈值 \(B\),可以预处理出斜率 \(\leq B\) 的 DP 数组。而对于斜率 \(>B\),要保证答案为正,切点的横坐标一定很小,大约为 \(\frac{n}{B}\) 级别,所以预处理出分 \(1\sim\frac{n}{B}\) 段的 DP 值。复杂度 \(O(n\sqrt n\log n)\) 过不去。
考虑优化。那就是要把线段树优化 DP 的 \(\log\) 去掉。我们要做的是在序列后面添加一个值,后缀 \(+1\) 以及求最大值。可以用单调栈维护,用一个并查集来维护后缀在并查集上的位置。如果写严格线性并查集可以做到 \(O(n\sqrt n)\)。
Day 6
T1 QOJ 7979
发现自然数底数没前途,而且差不多是越小越优。
尝试构造斐波那契数列,其底数为 \(\phi\)。发现确实可以。
T2
首先拆绝对值贡献,如果一个点在左边匹配那么贡献就是 \(-i+w_i\),在右边就是 \(i+w_i\)。
然后有一个重要结论:假如确定了一个前缀的匹配状态,那么要么没匹配的颜色只有一种,要么它们都跟一种颜色匹配。
所以可以设计 DP,\(f_{i,j,k,l,0/1}\) 表示前 \(i\) 个数,有 \(j\) 个没匹配,没匹配的颜色是 \(k\),扔掉了 \(l\) 个点的方案数,都是颜色 \(k\) 还是都跟 \(k\) 匹配。转移显然 \(O(1)\)。
Day 7
T1
有一棵 \(n\) 个点的树,有 \(m\) 条链,定义区间 \([l,r]\) 的价值为编号 \(l\sim r\) 的链的点集并的大小。\(q\) 次询问 \([L,R]\) 求其所有子区间的价值和。
\(n,m\leq 2\times 10^5,q\leq 5\times 10^5\)。
先树剖变成序列问题。扫描线扫描右端点,考虑实时维护每个左端点的价值,然后上个历史和线段树就行了。维护 \(tim_i\) 表示如果从右往左做操作点 \(i\) 何时被覆盖,那么加入一条新链相当于区间覆盖。用颜色段均摊维护的同时在线段树上区间加即可。\(O(n\log^2n+q\log n)\)。
T2
给你一个 \(n\) 个点的有向图,你要删除三条边使图不强连通。求删边方案数。
\(n\leq 70,m\leq \frac{n(n-1)}{2}\)。
纯暴力 \(O(m^3(n+m))\)。
考虑刻画强连通,发现其等价于每个点与 \(1\) 都强连通。所以可以把 Tarjan 换成正图反图各 BFS 一次,压位做到 \(O(n)\) 判断(其实是 \(O(n^2/\omega)\) 但是 \(n<\omega\))。所以总复杂度 \(O(m^3n)\)。
继续压缩。考虑对正图反图 BFS 出生成树,最多 \(2(n-1)\) 条边。若这个生成树的边都没有被删,则一定强连通。
考虑递归,设 \(\operatorname{solve}(E,k)\) 表示在边集 \(E\) 中选 \(k\) 条删掉使其不强连通的方案数。若当前 \(E\) 已经不强连通直接返回 \(\binom{|E|}{k}\),否则 BFS 正图反图的生成树,删掉一条边,然后递归子问题。
总复杂度 \(O(n^4)\)。
T3
定义一个序列的价值为其所有子区间的 \(\min\times len\) 的最大值。给你两个序列 \(\{A_n\},\{B_m\}\),\(q\) 次询问 \(L,R\) 问若把整个 \(A\) 与 \(B\) 的 \([L,R]\) 区间以任意顺序归并起来,其价值最大为多少。
\(n,m\leq 1.5\times 10^5,q\leq 5\times 10^5\)。
首先这个问题相当于在 \(A\) 中选一个子区间 \(a\),\(B\) 的 \([L,R]\) 中选一个子区间 \(b\),最大化 \(\min\{a,b\}\times (len_a+len_b)\)。
可以得到 \(a\) 必定是 \(A\) 的笛卡尔树区间,\(b\) 必定是 \(B\) 的笛卡尔树区间与 \([L,R]\) 的交。
对于 \(B\) 的笛卡尔树区间与 \([L,R]\) 交为其本身的情况,可以预处理每个区间的答案最后做一个二维数点,剩下的情况就是 \(b\) 为 \([L,R]\) 的前缀或后缀。不妨假设为后缀。
预处理出 \(A_i\) 表示 \(A\) 中 \(\min \geq i\) 的区间最长长度。对 \(R\) 扫描线维护 \(B_i\) 表示 \(\min \geq i\),以 \(R\) 为右端点的区间最长长度,则每次扩展相当于对 \(B\) 前缀 \(+1\),后缀推平成 \(0\),对一个后缀查 \(i\times (A_i+B_i)\) 的最大值。注意到有可能成为最优答案的点 \((i,A_i+B_i)\) 只可能在上凸壳上,于是分块套凸包可以做到 \(O(n\sqrt n)\)。

浙公网安备 33010602011771号