2025.11.2 ZROI
- 理想得分:100+100+100+24
- 期望得分:100+100+20+0
- 实际得分:100+100+20+0
上升序列 *1600
给定两个单调不降序列 \(a,b\),执行不超过 \(m\) 次操作,每次操作选择一个 \(a_i\) 和一个整数 \(x\),执行 \(a_i\gets a_i+x\),并耗费 \(x^2\) 的代价。操作过程中始终需要保证 \(a\) 不降。问将 \(a\) 变为 \(b\) 的最小代价。或报告无解。
\(1\le n,m\le 10^5,0\le a_i,b_i\le 10^9\),\(a,b\) 单调不降。
1s 1GB
考虑假设有一个极长的段 \([l,r]\),满足 \(\forall i\in[l,r]\),\(a_i<b_i\)。那么我们可以从 \(r\) 到 \(l\) 依次修改 \(a_i\),这样可以始终保证 \(a\) 不降;\(a_i>b_i\) 同理。因此对于每个位置,我们都可以直接看成是独立的。那这样的话,令 \(c_i=|a_i-b_i|\),设 \(c_i>0\) 的有 \(k\) 项,那么无解即为 \(m<k\)。
现在我们需要对 \(c_i\) 总共做 \(m\) 次划分的操作。贪心地,将 \(c_i\) 划分成 \(j\) 个段时,平均分的代价和最小。这个基本不等式可以求得。
于是用堆维护每个 \(c_i\) 当前被划分的段数,然后每次从堆中取出,再多划分一段后代价减小最多的,并执行这个操作。时间复杂度 \(O((n+m)\log n)\)。
生成树 *2000
给定一棵 \(n\) 个节点的以 \(1\) 为根的树,节点 \(i\) 的父亲为 \(\text{fa}_i\),并且有 \(1\le\text{fa}_i<i\ (i\in[2,n])\)。求所有可能的树的树高之和。对素数 \(p\) 取模。
\(2\le n\le 800,10^8\le p\le10^9,p\in\mathbb P\)。
2s 1GB
考虑这样的树有什么共同的性质。由于一定有 \(\text{fa}_2=1\),所以可以考虑 \(2\) 子树内和 \(2\) 子树以外的部分。dp,设 \(f_{i,j}\) 表示考虑了前 \(i\) 个点,树高为 \(j\) 的方案数。那么这棵树取到高度 \(j\) 有两种情况:
-
\(2\) 子树的高度为 \(j-1\):枚举 \(2\) 子树的大小 \(k\) 和 \(2\) 子树外的高度 \(x\),然后 \(2\) 子树内有 \(k-1\) 个点的编号集合是可以任意确定的,所以有:
\[f_{i,j}\gets f_{i,j}+\sum\limits_{k=1}^{i-1}\sum\limits_{x=1}^jf_{k,j-1}\cdot f_{i-k,x}\cdot\binom{i-2}{k-1} \] -
\(2\) 子树外的高度为 \(j\):枚举 \(2\) 子树的大小 \(k\) 和 \(2\) 子树的高度 \(x\),编号集合和上一种情况一样,所以组合数也一样。此外由于上一种情况已经包含了 \(2\) 子树内高度为 \(j-1\)(此时 \(2\) 子树内外的最大深度都是 \(j\))的情况,所以这里枚举 \(2\) 子树的高度只能到 \(j-2\)。那么有:
\[f_{i,j}\gets f_{i,j}+\sum\limits_{k=1}^{i-1}\sum\limits_{x=1}^{j-2}f_{k,x}\cdot f_{i-k,j}\cdot\binom{i-2}{k-1} \]
上面两个直接转移是 \(O(n^4)\) 的,维护前缀和可以优化到 \(O(n^3)\)。
归并排序 *2200
给定一个长度为 \(n\)(\(n\) 为 \(2\) 的幂)的排列 \(a\) 做归并排序,但是递归到区间长度为 \(2\) 时随机交换,其余归并过程不变。维护 \(q\) 次操作:
- \(\texttt1\ x\ y\):交换 \(a_x,a_y\)。
- \(\texttt2\ x\ y\):如果对当前的 \(a\) 做上述归并排序后得到 \(a'\),求 \(a'_y=a_x\) 的概率。对 \(10^9+7\) 取模。
\(2\le n\le 2^{18}\),\(n\) 为 \(2\) 的幂,\(a\) 为 \(1\sim n\) 的排列,\(1\le q\le 5\times10^5\)。
归并的过程,相当于把一个递减的段合并成一组后,以组中最大的数作为归并时比较的值,进行归并。于是对于一组 \((a_{2k-1},a_{2k})\),若交换后逆序了,则合并成一组。
\(P(a'_y=a_x)\) 的概率相当于是 \(a_x\) 排到第 \(y\) 个的概率。考虑可能随机交换的一组 \((a,b)\),不妨设 \(a<b\)。假设现在有一组数以 \(x\) 来比较。
- \(x<a\):此时 \(a,b\) 一定都会排在 \(x\) 后面。
- \(b<x\):此时 \(a,b\) 一定都会排在 \(x\) 前面。
- \(a<x<b\):此时,如果 \(a,b\) 是顺序的,那么一个在 \(x\) 之前一个在 \(x\) 之后;否则两个都会排在 \(x\) 之后。
那么考虑用 BIT 维护一定在 \(a_x\) 之前的数的数量。求答案可以计算一个组合数。时间复杂度 \(O((n+q)\log n)\)。
*DFS 序
2025.11.9 ZROI
- 理想得分:100+100+100+20
- 期望得分:100+36+0+20
- 实际得分:100+36+0+10
Andnot *1600
给定一个长度为 \(n\) 的非负整数序列 \(a\),任意重排 \(a_i\),最小化 \(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n(a_i\text{ and }(\text{not }a_j))\)。
\(1\le n\le 5\times10^5,0\le a_i<2^{29}\)。
1s 1GB
对于一对 \((x,y)\),若 \(x<y\),则 \(x\text{ and }(\text{not }y)\le y\text{ and }(\text{not }x)\)。故 \(a_i\) 升序时最优。然后按位计算贡献即可。要开 ull。时间复杂度 \(O(n\log n+n\log V)\)。
Binstr *2100
给定一个长度为 \(n\) 的 \(\tt 01\) 串。现可以对其进行任意次(可以为零)操作,每次操作为如下之一:
- 删除一个子串 \(\tt 01\)。
- 删除一个子串 \(\tt 10\)。
- 将一个子串 \(\tt 0\) 替换成 \(\tt 00\)。
最大化最终可能包含的形如 \(\tt 0101\cdots01\) 的连续 \(\tt 01\) 个数,并在此前提下最小化操作次数。
\(1\le t\le 5,1\le n\le 5\times10^5\)。
1s 1GB
执行操作三的时候,后面必然会执行操作一或二,不然不优。所以替换过程可以变为如下四种:
- \(\tt01\to\varnothing\),代价为 \(1\)。
- \(\tt10\to\varnothing\),代价为 \(1\)。
- \(\tt 01\to0\),代价为 \(2\)。
- \(\tt10\to0\),代价为 \(2\)。
将 \(\tt 0\) 看作向右下,\(\tt 1\) 看作向右上,则将 \(\tt 01\) 串变成一条折线,并且字符位于其指向方向的拐点处。由于操作只能删去 \(\tt 1\) 或者一对 \(\tt0\) 和 \(\tt 1\),所以最终这个最长的答案子串内,每个位置在最初的折线上纵坐标单调不减。容易发现这是充要的。
因此只要在这个折线上求出这样的最长不降子序列即可。BIT 维护即可,操作次数可以统计 \(\tt0\) 和 \(\tt1\) 的个数求出。时间复杂度 \(O(n\log n)\)。
Disconnect *2100
给定 \(n\) 个点的树,点 \(i\) 有权值 \(a_i\),它和点 \(p_i(p_i<i)\) 相连。将树删去若干条边,设 \(t_i\) 表示在树上和当前点 \(i\) 所在连通块内的某个点相邻,且在新图中不与点 \(i\) 连通的节点个数。最大化 \(\sum\limits_{i=1}^na_it_i\)。给定 \(n_0\),对于保留前 \(n_0,n_0+1,\cdots,n\) 个点所构成的树,都要求出答案。
\(1\le n_0\le n\le 5\times10^5,1\le p_i<i,1\le a_i\le 2\times10^7\)。
1s 1GB
对于一个非叶子节点来说,它本身要尽可能地最大化贡献,那么就需要它所在的连通块的邻域尽可能多。因此删的边只可能是连接叶子的边。进一步发现删的边一定连接了权值最小的几个叶子。然后这东西算一下贡献发现是凸的。三分即可。由于要支持动态加点,用 BIT 维护即可。时间复杂度 \(O(n\log n)\)。
*Partition
2025.11.10 OIFC
- 理想得分:100+100+0+0
- 期望得分:100+0+0+0
- 实际得分:100+0+0+0
旅行 *1600
给定一个 \(n\) 个点的树。要求选择一个起点,构造一条路径,并且这条路径经过 \(m\) 次节点,并且共经过 \(k\) 种不同的节点。或报告无解。
\(1\le k\le n\le 4\times10^5,1\le m\le 2n\)。
1s 512MB
从直径的一段走到另一端,剩下没走的节点都挂在直径上,每个未走的节点都需要一来一回,贡献两步,可以插入到在走直径的过程中。构造出这样的路径后再在某条边上来回走达到 \(m\) 的限制。无解在模拟行走的过程可以判得。时间复杂度 \(O(n+m)\)。
区国的魔法 *2000
给定两个 \(1\sim n\) 的排列 \(a,b\)。\(n\) 次选择,第 \(i\) 次选择需要选择 \(a_i\) 或 \(b_i\)。问最终选择的数有至少 \(k\) 种的选择方案数。对 \(10^9+7\) 取模。
\(1\le k\le n\le 10^4,1\le a_i,b_i\le n\)。
1s 256MB
将 \(a_i,b_i\) 连边后就相当于是若干个置换环,需要给其定向,要求度数不为 \(0\) 的点至少有 \(k\) 个。设 \(f_i\) 表示当前处理过的若干个完整置换环,非零度点恰有 \(i\) 个的定向方案数。
对于每个置换环内部再 dp。设 \(g_{i,j,0/1}\) 表示当前处理的置换环内处理了前 \(i\) 个点,非零度点有 \(j\) 个,并且上一个点的定向方向。然后可以容易计算出方案数。最后再将 \(g\) 和 \(f\) 暴力合并得到新的 \(f\)。最终答案即为 \(\sum\limits_{i=k}^nf_i\)。时间复杂度 \(O(n^2)\)。
*最大独立集问题
*树
2025.11.12 OIFC
- 理想得分:100+100+12+36
- 期望得分:100+36+12+36
- 实际得分:100+36+12+36
破译系统 *1600
给定一个长度为 \(n\) 的非负整数序列 \(a\),现将其划分成任意个非空子段 \(S_1,S_2,\cdots,S_k\)。问有多少种划分方法,满足 \(\mathop{\text{mex}}\limits_{i=1}^k\{\min\{S_i\}\}=\min\limits_{i=1}^k\{\text{mex}\{S_i\}\}\)。
\(1\le n\le 5\times10^5,0\le a_i\le 10^9\)。
1s 512MB
若 \(a\) 中不存在 \(0\),那么一定有 \(\min\{S_i\}>0\) 和 \(\text{mex}\{S_i\}=0\),所以这时条件一定成立。划分方案数即为 \(2^{n-1}\)。
若 \(a\) 中存在 \(0\),那么一定存在至少一个 \(S_i\) 满足 \(\min\{S_i\}=0\) 和 \(\text{mex}\{S_i\}>0\)。前者可以得到 \(\mathop{\text{mex}}\limits_{i=1}^k\{\min\{S_i\}\}>0\),进而得到 \(\min\limits_{i=1}^k\{\text{mex}\{S_i\}\}>0\),因此每个 \(S_i\) 内都要有一个 \(0\)。这导致了所有的 \(S_i\) 都满足 \(\min\{S_i\}=0\)。因此 \(\mathop{\text{mex}}\limits_{i=1}^k\{\min\{S_i\}\}=1\),即 \(\min\limits_{i=1}^k\{\text{mex}\{S_i\}\}=1\)。
也就是说,我们划分出的子段需要满足的条件有:
- 每个 \(S_i\) 内都必须存在 \(0\)。
- 至少一个 \(S_i\) 内不包含 \(1\)。
然后就可以对着当前是否存在不包含 \(1\) 的段直接 dp。我想了一个奇异搞笑的复杂 dp。设 \(f_{i,0/1,0/1,0/1}\) 表示考虑了前 \(i\) 个数,除 \(a_i\) 所在段外,前面的完整段是否存在不包含 \(1\) 的段,当前段是否有 \(0\),当前段是否有 \(1\),对应的划分方案数。
对 \(a_i\) 分讨就可以得到一大坨状态转移。注意需要对 \(a_i\) 是否为新一段的开头分别转移,再加起来。
-
\(a_i=0\):
\[\begin{aligned} f_{i,0,1,0}&=f_{i-1,0,0,0}+f_{i-1,0,1,0}+f_{i-1,0,1,1}\\ f_{i,0,1,1}&=f_{i-1,0,0,1}+f_{i-1,0,1,1}\\ f_{i,1,1,0}&=f_{i-1,1,0,0}+f_{i-1,1,1,0}+f_{i-1,0,1,0}+f_{i-1,1,1,1}+f_{i-1,1,1,0}\\ f_{i,1,1,1}&=f_{i-1,1,0,1}+f_{i-1,1,1,1} \end{aligned} \] -
\(a_i=1\):
\[\begin{aligned} f_{i,0,0,1}&=f_{i-1,0,0,0}+f_{i-1,0,0,1}+f_{i-1,0,1,1}\\ f_{i,0,1,1}&=f_{i-1,0,1,0}+f_{i-1,0,1,1}\\ f_{i,1,0,1}&=f_{i-1,1,0,0}+f_{i-1,1,0,1}+f_{i-1,0,1,0}+f_{i-1,1,1,1}+f_{i-1,1,1,0}\\ f_{i,1,1,1}&=f_{i-1,1,1,0}+f_{i-1,1,1,1} \end{aligned} \] -
\(a_i>1\):
\[\begin{aligned} f_{i,0,0,0}&=f_{i-1,0,0,0}+f_{i-1,0,1,1}\\ f_{i,0,0,1}&=f_{i-1,0,0,1}\\ f_{i,0,1,0}&=f_{i-1,0,1,0}\\ f_{i,0,1,1}&=f_{i-1,0,1,1}\\ f_{i,1,0,0}&=f_{i-1,1,0,0}+f_{i-1,0,1,0}+f_{i-1,1,1,0}+f_{i-1,1,1,1}\\ f_{i,1,0,1}&=f_{i-1,1,0,1}\\ f_{i,1,1,0}&=f_{i-1,1,1,0}\\ f_{i,1,1,1}&=f_{i-1,1,1,1} \end{aligned} \]
最终答案即为 \(f_{n,0,1,0}+f_{n,1,1,0}+f_{n,1,1,1}\)。时间复杂度 \(O(n)\)。
单源最短路 *2100
给定一个 \(n\) 点 \(m\) 边的有向图,对于第 \(i\) 条边有 \(k_i\) 个经过该边后不能立刻走的边。求从 \(1\) 开始到每个点的最短路。
\(1\le t\le 3,1\le n,m\le 5\times10^5,0\le w,k_i,\sum k_i\le 10^6\)。
2.5s 512MB
考虑对边建图跑 Dijkstra。注意到,忽略限制后我们只需要考虑到 \(i\) 号边的距离前 \(k_i+1\) 小的边。这时这里面必然有可以直接松弛到该边的边。于是在跑 Dijkstra 时,如果某条边被成功松弛,则直接删去连接这两条边的边。均摊下来只需要松弛 \(O(\sum k_i)\) 次。故时间复杂度为 \(O(m\log m+\sum k_i)\)。
*重构
*区间移动
2025.11.14 OIFC
- 理想得分:100+100+100+0
- 期望得分:0+100+0+0
- 实际得分:0+95+0+0
蛇 *2800
对于一个 01 串,给定常数 \(k\),可以任意次地进行如下操作之一:
- 选择一个长度为 \(k\) 的子串并将每一位 01 翻转。
- 选择一个长度为 \(k\) 的子串,要求全 0 或全 1,并将其删去。
现在给定一个长度为为 \(n\) 的 \(\tt 01?\) 串和常数 \(k\),求将每个 \(\tt?\) 分别任意地替换成 \(\tt 0\) 或 \(\tt 1\) 后,可以按照上述操作得到的所有可能的不同的字符串的数量。对 \(10^9+7\) 取模。
\(1\le t\le 10,1\le k\le n\le 10^5\)。
1.5s 512MB
先不考虑 \(\tt ?\)。将原序列异或差分,则两个操作就变成了在一个长度为 \(n+1\) 的 \(\tt 01\) 序列 \(a_{[0,n]}\) 上的修改(约定 \(a_{n}=0\)):
- 选择一个 \(i\),执行 \(a_i\gets a_i\oplus1\),\(a_{i+k}\gets a_{i+k}\oplus1\)。
- 选择一个 \(i\),保证对于 \(\forall j\in(i,i+k)\),\(a_j\) 全部相同,则将 \(a_{[i,i+k]}\) 整体替换成一个 \(a_i\oplus a_{i+k}\)。
那么问题可以转化成对 \(a\) 计数。发现可以将 \(a_i\) 按照 \(i\bmod k\) 相同的位置分开考虑。操作一不会改变异或和。因此对于一个长度相同的序列 \(a'\),若满足对于 \(\forall i\in[0,k)\),\(\bigoplus\limits_{j\bmod k=i}a'_j=\bigoplus\limits_{j\bmod k=i}a_j\),那就一定可以被表示出来。
接下来考虑操作二。发现这种操作对于 \(\forall i\in[0,k)\),\(\bigoplus\limits_{j\bmod k=i}a_j\) 仍旧不变,因此只需要对所有长度 \(m\equiv n+1\pmod k\) 的做一样的计数即可。
接下来考虑存在 \(\tt ?\) 的情况。设 \(v_i\) 表示最终的序列所要求 \(\bmod\ k=i\) 的位置的异或和。那么对于一个位置 \(i\) 上的 \(\tt ?\) 相当于可以让 \(v_{i\bmod k}\) 和 \(v_{(i+1)\bmod k}\) 同时异或 \(1\)。将二者连边,则同一连通块内的均可任意改变。只需要统一连通块内的 \(v_i\) 不同即可。
时间复杂度 \(O(n)\)。
白日窃贼 *1800
给定一个 \(1\sim n\) 的排列 \(a\),给定一个常数 \(k\),每次操作可以选择一对 \(a_x,a_y\),要求 \(|a_x-a_y|=k\),并将 \(a_x,a_y\) 交换。求使得 \(a\) 升序的最小操作次数,或报告无解。对 \(k=1\sim n\) 都求出答案。
\(1\le n\le 10^5\)。
1.5s 512MB
对于一个数 \(a_j=i\) 需要到 \(i\) 的位置,因此需要保证 \(k\mid|a_i-a_j|\)。也就是说,有解时一定满足 \(k\left|\gcd\limits_{i=1}^n\{a_i-i\}\right.\)。
于是分别考虑每个 \(k\)。注意到一组可以相互交换的 \(k\) 在下标上 \(\bmod\ k\) 同余,所以可以直接拿出来。然后计算交换次数。由于一次交换最多减少一个逆序对,所以最优交换次数即为逆序对个数。BIT 维护即可。
时间复杂度 \(O(d(n)\cdot n\log n)\)。
树形分流器 *2800
有一棵 \(2n-1\) 个节点的、以 \(1\) 为根的完全二叉树,节点 \(i\) 的左右儿子分别为 \(\text{son}_{i,0/1}\)。每个非叶子节点 \(i\) 有权值 \(a_i,t_i\ (t_i\in\{0,1\})\),当它收到一个大小为 \(x\) 的物品时,若 \(x\ge a_i\),则将 \(x\) 移动到 \(\text{son}_{i,t_i}\),否则移动到 \(\text{son}_{i,1-t_i}\)。初始 \(a_i=0\)。
现在可以不花费代价地修改 \(t_i\),或者将 \(a_i\) 修改为整数 \(a'_i\),并花费 \((a_i-a'_i)^2\) 的代价。定义 \(f(u,l,r)\) 表示对于一棵以 \(u\) 为根的子树(保证子树的叶子数量恰好为 \(r-l+1\)),能够使得依次让节点 \(u\) 接收大小为 \(l,l+1,\cdots,r\) 的物品后,每个叶子上恰好有一个物品的最小总修改代价(接收和移动过程中不进行修改)。
现在有 \(q\) 次操作。每次给出 \(u,y,v,l_1,r_1,l_2,r_2\),表示先操作 \(a_u\gets y\),然后求 \(f(v,l_1,r_1)-f(v,l_2,r_2)\) 的值。
\(1\le n,q\le 10^6\),\(0\le \text{son}_{i,0},\text{son}_{i,1},u,v\le 2n-1\),\(-10^9\le y_i,l_i,r_i\le 10^9\),\(r_2-l_2=r_1-l_1\) 且操作和询问合法。
2.5s 512MB
首先肯定可以将 \(a_i\) 调整成 \([l,r]\) 的数,设 \(f(v,l_1,r_1)\) 可以对应到某种最优策略,这时每个 \(a_i\) 有自己在子树中的 \(a\) 的的排名 \(a_i-l\)。如果 \(f(v,l_1,r_1)\) 的最优策略上在 \(f(v,l_2,r_2)\) 不成立,那这时将后者的策略放到前者,前者的策略会更优。因此 \(f(v,l,r)\) 的最优策略和 \(l,r\) 无关。于是对于一个 \(v\),其所有最优策略下 \(a_i-l\) 都是相同的。
设每个 \(a_i\) 被调整成一个 \(l+p_i\),那么:
设 \(\text{sz}_i\) 表示子树 \(i\) 的非叶子节点数,于是就有:
用 BIT 维护单点加子树和即可。时间复杂度 \(O(n+q\log n)\)。
*饭语
2025.11.16 ZROI
- 理想得分:100+100+100+20
- 期望得分:100+20+100+0
- 实际得分:50+20+100+0
数论 *1800
给定一个长度为 \(n\) 的非负整数序列 \(a\) 和一个常数 \(m\)。\(m=0\) 表示 A 先手,否则 B 先手。A 和 B 轮流对序列操作,每次可以取出相邻两数 \(x,y\) 并删去,然后在原位置插入 \(x\times y\) 或 \(x+y\)。若最终序列剩下的一个数为偶数,则 A 胜,否则 B 胜。
\(1\le n\le 10^5,0\le a_i\le 10^9\)。
1s 512M
首先显然操作只和 \(a_i\) 奇偶性有关,故先执行 \(a_i\gets a_i\bmod2\)。
\(n=1\) 显然。
然后考虑可以进行的操作,包括以下几种:
- \((0,0)\to(0)\)。
- \((0,1)\to(0)/(1)\)。
- \((1,0)\to(0)/(1)\)。
- \((1,1)\to(0)/(1)\)。
发现当序列剩下两个数时,无论怎样都可以操作到剩下一个 \(0\)。因此如果 A 做了最后一次操作,那么 A 必胜。这种情况即是 \(m\equiv n\pmod2\) 的时候。
考虑剩下的情况,B 需要保证序列最终剩下的不能是两个 \(0\)。对于 B 来说,他的最优操作必然是每次将序列中 \(0\) 的个数 \(-1\)。
对于 A 来说,如果出现 \((1,1)\),直接换成 \((0)\) 是最优的,这时 \(1\) 的个数 \(-2\) 并且 \(0\) 的个数 \(+1\);不存在的话就是将 \(1\) 的个数 \(-1\)。这时对 B 而言,他必然要将这个 \(0\) 删去。也就是 A 删去这对 \((1,1)\) 不需要耗费代价。于是我们先删去这些 \((1,1)\),最后再统计 \(0,1\) 的个数,相互消即可。
时间复杂度 \(O(n)\)。
朱刘算法 *2000
给定 \(n\) 个三元组 \((l_i,r_i,v_i)\)。对于一个排列 \(p\),设数 \(i\) 在排列中出现的下标为 \(\text{pos}_i\),则该排列的权值为 \(\sum\limits_{i=1}^n[l_i\le\text{pos}_i\le r_i]\cdot v_i\)。求权值的最大值。
\(1\le l_i\le r_i\le n\le 2\times10^5\),\(0\le v_i\le 10^4\)。
1s 512MB
考虑连边 \(i\to j\ (j\in[l_i,r_i])\),那么对于一个 SCC 来说,将它内部排列只会有一个点的权值取不到,而如果其存在出边,那么这个点的权值也能取到。于是只要将总权值和减去每个不存在出边的 SCC 中边权最小的即可。建图使用线段树优化,时间复杂度 \(O(n\log n)\)。
快速傅里叶变换 *2800
给定正整数 \(n,m\),然后依次执行如下过程:
- 在 \([1,m]\) 中均匀随机 \(n\) 个互不相同的正整数。
- 将他们升序排列得到 \(\{a_1,a_2,\cdots,a_n\}\)。
- 对 \(a\) 差分,得到 \(\{a_1,a_2-a_1,\cdots,a_n-a_{n-1}\}\)。
- 将差分数组升序排列,得到 \(\{b_1,b_2,\cdots,b_n\}\)。
- 对 \(b\) 求前缀和,得到 \(\{b_1,b_1+b_2,b_1+b_2+b_3,\cdots\}\)。
求最终得到的序列的每一位的期望,对 \(998244353\) 取模。
\(1\le n\le 3000,1\le m\le 3\times10^5,n\le m\)。
1s 512MB
为了方便,我们将题目里的 \(b\) 写作 \(b'\),令 \(b_i=a_i-a_{i-1}\)。同时设 \(\text{ans}_i=\sum\limits_{j=1}^ib_j\),那么问题相当于要求 \(E(\text{ans}_1),E(\text{ans}_2),\cdots,E(\text{ans}_n)\)。
对于 \(1\sim 3\) 步,显然可以看作在数轴 \([1,m]\) 上随机取 \(n\) 个正整数断点后,切割成长度分别为 \(b_1,b_2,\cdots,b_n,m-a_n+1\) 的段。这个最后的长度为 \(m-a_n+1\) 的段很难处理,不妨设 \(b_{n+1}=m-a_n+1\),那么 \(\sum\limits_{i=1}^{n+1}b_i=m+1\)。设将 \(b_{[1,n+1]}\) 升序排列后得到 \(b''_{[1,n+1]}\),这东西看着就比 \(b'_{1,n}\) 能做!
设 \(b''_i\) 的前缀和为 \(\text{sum}_i\),考察一下 \(E(\text{sum}_i)\) 和 \(E(\text{ans}_i)\) 的关系。对 \(b_{n+1}\) 的大小讨论:
- 若 \(b_{n+1}\) 在 \(b''_{[1,i]}\) 中,那它需要被删去并加进来一个 \(b''_{i+1}\)。\(b_{n+1}\) 有 \(i\) 种排名,于是这种情况会产生贡献 \(E(E(\text{sum}_{i+1})-b_{n+1}))=E(\text{sum}_i)-E(b_{n+1})\)。
- 若 \(b_{n+1}\) 不在 \(b''_{[1,i]}\) 中,那这时期望依旧是 \(E(\text{sum}_i)\),共 \(n-i+1\) 种排名,会产生 \(E(E(\text{sum}_i))=E(\text{sum}_i)\) 的贡献。
枚举 \(b_{n+1}\) 的排名 \(j\)(即 \(b''_j=b_{n+1}\))可以得到:
于是现在就考虑如何计算 \(E(\text{sum}_i)\)。
可以得到:
令 \(f_i=\sum\limits_{x=1}^mP\left(\sum\limits_{k=1}^{n+1}[b_k<x]=i\right)\),那么 \(E(\text{sum}_i)=\sum\limits_{j=0}^{i-1}(i-j)f_j\)。于是可以得到:
那么现在就考虑如何求 \(f_i\)。
先枚举选择 \(j\) 个在 \([1,x)\) 范围的数,然后容斥,钦定至少 \(t\) 个 \(b_k\ge x\)。然后现在要算出这样的方案数。这是有界插板法,可以得到:
最内部的组合数可以枚举倍数预处理计算,时间复杂度 \(O(m\log n+n^2)\)。
*暴力搜索
2025.11.18 OIFC
朝花夕拾 *1900
给定一个 \(n\) 点 \(m\) 边的简单无向连通图。初始所有点均为白色,每次操作等概率地选择一个白色点,并将其染黑。若某个点的所有邻居均为黑色,则该点自动变为黑色。求期望操作次数。对 \(998244353\) 取模。
\(1\le n,m\le 3\times10^5\)。
1s 256MB
首先是经典套路,将「在限制内选择」变成「初始随机一个排列,依次选择」,然后能操作则操作。那么我们相当于是要求期望的有效操作次数。根据期望的线性性,即求每个点被操作的概率之和。点 \(i\) 被自动染黑当且仅当它在排列中排在所有邻居的后面,那么反过来就有 \(1-\dfrac{1}{\deg_i+1}=\dfrac{\deg_i}{\deg_i+1}\) 的概率需要手动染黑。于是答案即为 \(\sum\limits_{i=1}^n\dfrac{\deg_i}{\deg_i+1}\),时间复杂度 \(O(n)\)。
平行线 *2200
给定一个 \(1\sim n\) 的排列 \(a\) 和常数 \(k\),执行如下操作,直到 \(a\) 升序。
- 依次对于 \(i=1,2,\cdots,n-k+1\),若 \(a_i,a_{i+1},\cdots,a_{i+k-1}\) 不是升序的,则花费 \(1\) 的代价将其升序排列。
求操作结束后所花费的代价。
\(1\le t\le 10\),\(2\le k\le n\le 2\times10^5\),\(1\le a_i\le n\)。
1s 256MB
从某一轮开始,将 \(a_{[1,k]}\) 升序排序后,中间扫到的某个区间 \([i,i+k-1]\),一定有 \([i,i+k-2]\) 是升序的,因此相当于是将 \(a_{i+k-1}\) 插入到这个区间内。
于是可以考察每个数向前插入的次数。设 \(c_i=\sum\limits_{j=1}^{i-1}[a_j>a_i]\)。那么对于区间 \([i,i+k-1]\),\(a_{i+k-1}\) 会向前移动 \(\min(c_{i+k-1},k-1)\) 个位置。也就是说,对于初始的 \(a_i\),它需要跳 \(\left\lceil\dfrac{c_i}{k-1}\right\rceil\) 抡才能结束。使用 BIT 维护即可。注意如果某几个数同时跳到 \([1,k]\),他们可以一起排序,这个特判一下。
时间复杂度 \(O(n\log n)\)。
*孤独之中神的祝福
*Back to Basics
2025.11.20 OIFC
- 理想得分:100+100+28+0
- 期望得分:100+0+28+0
- 实际得分:100+0+28+0
休息时间 *1800
给定一个长度为 \(n\) 的正整数序列 \(a\),有长度为 \(k\) 的区间 \([p,p+k]\),初始 \(p=p_0\)。现在需要重排 \(a\),然后依次对于 \(i=1,2,\cdots,n\),执行:
- 若 \(a_i\in[p,p+k]\),则将 \(a_i\) 标记。
- 若 \(a_i<p\),则执行 \(p\gets p-1\)。
- 若 \(a_i>p+k\),则执行 \(p\gets p+1\)。
最大化被标记的数的个数。
\(1\le n\le 10^6\),\(0\le a_i,k,p_0\le 10^9\)。
2s 1000MB
显然最优决策一定是区间向左后向右,或者向右后向左。于是枚举最先向左或向右达到的位置,然后可以二分和双指针得到另一侧可以达到的最远位置。时间复杂度 \(O(n\log n)\) 或 \(O(n)\)。
兼职时间 *2500
给定一个长度为 \(t\) 的环,环上整点依次用 \([0,t)\) 编号。有 \(m\) 个区间 \([l_i,r_i)\),若 \(l_i>r_i\) 则实际表示区间 \([l_i,t)\cup[0,r_i)\)。\(q\) 次询问,每次询问给定 \(n\) 个初始位置分别在 \(x_1,x_2,\cdots,x_n\) 的标记。现在可以在任意实数时刻选择至多一个区间,当前被选择的区间内的标记均不会移动,未被区间包含的标记均为以 \(1\) 的速度顺时针移动。最小化将所有标记聚集到一点所花费的时间。
\(1\le m\le 10^5\),\(1\le t\le 5000\),\(2\le n\le t\),\(\sum n\le 10^5\),\(0\le l_i,r_i<t\),\(l_i\neq r_i\),\(x_i\) 严格递增。
4s 2000MB
\(n\) 个标记聚到一起等价于有一个 \(x_i\) 追上了 \(x_{i+1}\)。于是问题等价于求任意一个 \(x_i\) 追上 \(x_{i+1}\) 的最小时间(约定 \(x_{n+1}=x_1\))。
对于某一对 \((x_i,x_{i+1})\) 的策略为,只要有一个区间包含 \(x_{i+1}\) 且不包含 \(x_i\),就一直选定它直到 \(x_i\) 进入该区间。于是可以直接 dp,设 \(f_{i,j}\) 表示一对 \((i,j)\) 的答案,可以直接写记搜。时间复杂度 \(O(m+t^2+\sum n)\)。
当你的天空突然下起了大雨 *2600
给定一棵 \(n\) 个点的以 \(1\) 为根的树,和一个长度为 \(m\) 的非负整数序列 \(a\)。初始所有节点均为白色,依次对于 \(i=1,2,\cdots,m\),顺序执行:
- 若 \(i=1\),则将节点 \(1\) 染黑;否则将所有父亲被染黑的白色节点染黑。
- 若 \(a_i\neq0\),则将以 \(a_i\) 为根的子树内的节点全部染白;否则不操作。
对于每个节点,求在这 \(m\) 个过程结束时,它是黑色的过程数。
\(1\le n,m\le 10^6\),\(0\le a_i\le n\),\(a_i\neq 1\)。
2s 500MB
考虑对每个节点维护一个长度为 \(m\) 的 01 串,表示每个过程结束时节点是否为黑色。那么一个节点 \(i\) 的 01 串相较于父亲的串,需要将每个极长 1 段开头的 1 变为 0,同时将所有 \(a_p=i\) 的位置 \(p\) 改为 0。答案即为每个节点中 1 的个数。将上述过程 dfs 的话,用栈维护撤销操作即可。
对于串中的每个极长 1 段的长度,都是关于深度的一次函数 \(y=-\text{dep}+b\)。于是需要维护这个 \(b\) 的增减及拆分。用 BIT 维护值域上 \(b\) 的个数即可。时间复杂度 \(O(n+m\log m)\)。
*鹿鸣林间
2025.11.23 OIFC
- 理想得分:100+100+100+100
- 期望得分:100+100+0+100
- 实际得分:100+100+0+100
世末积雨云 *1600
给定正整数 \(n,m\),求有多少种不同的长度为 \(n\) 的序列 \(a\),满足 \(a_i\in[0,m]\) 且所有 \([1,m]\) 在 \(a\) 均出现奇数次。对 \(10^9+7\) 取模。
\(1\le m\le n\le 2000\)。
1s 256MB
可以看作 \(a\) 初始全 \(0\)。显然可以得到的 dp 是,设 \(f_{i,j}\) 表示已经填了值域在 \([1,i]\) 的数,共填了 \(j\) 个对应的方案数。容易有:
答案即为 \(\sum\limits_{i=1}^nf_{m,i}\)。时间复杂度 \(O(n^2m)\),但是改成刷表后只转移非零的位置是可以跑过去的。
其实还有一种更简单的 dp。设 \(f_{i,j}\) 表示,考虑了 \(a\) 的前 \(i\) 位,其中有 \(j\) 种数的出现次数是奇数。则有:
时间复杂度 \(O(mn)\)。
纸花 *2000
有一个 \(1\sim n\) 的排列 \(p\),保证 \(p_1=1,p_n=n\)。有一个长度为 \(n-1\) 的非负整数序列 \(a\),令 \(a_i=\sum\limits_{i=1}^{n-1}[\min(p_i,p_{i+1})\le i\land\max(p_i,p_{i+1})>i]\)。现给定 \(a\),还原一种可能的 \(p\)。保证有解。
\(2\le n\le 2\times 10^5\)。
1s 256MB
将排列看作链上的移动,则 \(a_i\) 代表着边 \((i,i+1)\) 被经过的次数。那么 \(a_i\) 肯定都是奇数。
考虑设 \(\text{sol}(l,r)\) 表示 \(a_{[l,r]}\) 对应的行走路径,其中 \(a_l=a_r\)。首先整个过程需要从 \(l\) 走到 \(r\),而所有 \(a_i>a_l\) 的位置是需要我们回过去走的。考虑找到 \([l,r]\) 内所有 \(=a_l\) 的位置 \(p_1,p_2,\cdots,p_k\)。那么就分别需要在每个区间 \((p_i,p_{i+1})\) 内往回走,即 \(\text{sol}(l,r)=\{p_1,\text{sol}(p_1+1,p_2-1),p_2,\text{sol}(p_2+1,p_3-1),\cdots,p_k,\text{sol}(p_{k-1}+1,p_k-1)\}\)。\(p\) 可以链表预处理出来,时间复杂度 \(O(n)\)。
人生来就形只影单 *2500
给定一个 \(n+1\) 个点的图,其中对于点 \(i\in [0,n-1]\),它会连向点 \((i+1)\bmod n\)。同时所有 \(\text{popcount}(i)\) 为奇数的都会和点 \(n\) 连边。求断掉若干条边(可以不断)后图依旧连通的方案数。对 \(10^9+7\) 取模。
\(3\le n\le 10^{18}\)。
1s 256MB
考虑最终保留的和 \(n\) 相连的边,相邻两边之间的环边至多会断掉一条。于是设 \(f_{i,0/1,0/1}\) 表示考虑了前 \(i\) 条环边,第一条和最后一条连向 \(n\) 的边是否断开对应的方案数。这样做的时间复杂度为 \(O(n)\)。
用矩阵加速。设 \(M_{i,0/1}\) 表示 \([0,2^i)\) 的答案,有 \(M_{i,j}=M_{i-1,j}M_{i-1,1-j}\)。将 \(n\) 变为二进制 \(\sum\limits2^{a_i}\),则答案为 \(\prod M_{a_i,(i-1)\bmod 2}\)。时间复杂度 \(O(\log n)\)。
参考答案:略 *2200
有 \(n\) 个物品和两个栈,要求第 \(i\) 个物品在 \(a_i\) 时刻进入某个栈,并且要恰好在 \(b_i\) 时刻时该栈栈顶为 \(i\),并出栈。构造一种给所有物品安排进入的栈的方案。保证有解。
\(1\le n\le 10^6\),\(1\le a_i,b_i\le 2n\),\(a,b\) 构成一个 \(1\sim 2n\) 的排列。
3s 256MB
两个物品 \(i,j\ (a_i<a_j)\) 不能在同一个栈当且仅当 \(a_i<a_j<b_i<b_j\)。那么可以考虑将 \((i,j)\) 连边,最后跑一个二分图染色即可。
直接连边显然不行。但是考虑,假设 \(i\) 已经对集合 \(S\) 内的点分别连边,那么后续只需要给 \(S\) 内的一个元素连边就可以确定颜色。于是用 set 维护连续段即可。时间复杂度 \(O(n\log n)\)。
2025.11.24 OIFC
- 理想得分:100+100+60+48
- 期望得分:100+0+0+32
- 实际得分:100+0+0+32
传送门 *2400
有 \(k+1\) 行,每行有 \(n\) 个房间。有 \(k\) 个 \(1\sim n\) 的排列 \(p_1\sim p_k\)。从第 \(i\) 行的第 \(j\) 个房间可以走到第 \(i+1\) 行的第 \(p_{i,j}\) 或第 \(p^{-1}_{i,j}\) 个房间。构造这 \(k\) 个排列,使得第 \(1\) 行的任意点可以到达第 \(k+1\) 行的任意点。保证有解。
\(3\le n\le 1000\),\(\lceil\log_2n\rceil+1\le k\le 1000\)。
1s 512MB
观察 \(k\) 的下界,意味着每一层行走都需要将可达点数量 \(\times 2\)。
容易猜到一种 \(p_{i,j}=((j+2^{i-1}-1)\bmod n)+1\) 的构造,初始在 \(x\) 的话,可以到达 \(x-C+\{2,4,\cdots,2^k\}\)。如果 \(n\) 是奇数的话那就对了,然而偶数的时候只能到达相同奇偶性的地方。
考虑一开始的时候改变奇偶性。可以将 \([1,n]\) 每四个划分成一组,对于一组 \((i,i+1,i+2,i+3)\),分别连向 \((i+2,i,i+3,i+1)\)。如果 \(n\bmod4=2\),那就需要从开头和从结尾各每四个进行划分,这样可以保证每个数都走到不同奇偶性的位置上。这样最多 \(2\) 步并且还到达了 \(4\) 个点。再做上面的构造即可。
时间复杂度 \(O(nk)\)。
岁月 *2600
给定正整数 \(k\) 和长度为 \(n\) 的非负整数序列 \(a\),其中 \(a_i\in[0,2^k)\),且 \(a_i\le a_{i+1}\)。
定义:
\[\begin{aligned} c(n,x)&=\max\limits_{i=0}^x\{n\oplus i\}\\ f(n,x)&=\max\limits_{i=1}^n\{c(a_i,x)\}\\ g(n,x)&=\sum\limits_{i=1}^n[c(a_i,x)=f(n,x)] \end{aligned} \]求 \(\left(\sum\limits_{x=0}^{2^k-1}f(n,x)\right)\bmod2^{64}\) 和 \(\left(\sum\limits_{x=0}^{2^k-1}g(n,x)\right)\bmod 2^{64}\)。
\(1\le n\le 5\times10^6\),\(0\le k<64\),\(0\le a_i<2^k\)。
1s 512MB
显然有 \(f(n,x)=c(a_n,x)\)。那么对于第一问可以将贡献按位划分成若干个 \([0,2^k)\) 的前缀(可以放到 01-trie 上看),可以求得答案。
对于第二问,首先有 \(g(n,x)=\sum\limits_{i=1}^n[c(a_i,x)=f(n,x)]=\sum\limits_{i=1}^n[c(a_i,x)=c(a_n,x)]\)。对于每个 \(x\),满足条件的 \(a_i\) 是一个后缀。考虑枚举 \(x\) 从高位到低位的状态,找到匹配贴着上界的和自由位对应的两个区间,可以双指针完成。时间复杂度 \(O(n+k)\)。
*流星雨
安全 *2800
给定一棵 \(n\) 个点带边权(\(w\))的无根树,初始依次加入 \(m\) 个安全设施,有参数 \((p_i,k_i)\),表示它位于节点 \(p_i\),并且会保护到该节点的距离 \(\le k_i\) 的点。\(q\) 次操作:
- \(\texttt1\ p \ k\):加入一个参数为 \((p,k)\) 的安全设施。
- \(\texttt2\ x\):移除第 \(x\) 个加入的安全设施,保证该设施目前存在。
- \(\texttt3\ u\ v\):查询节点 \(u\) 到 \(v\) 间的路径上的节点是否均被保护。
\(1\le n,m,q\le 5\times10^5\),\(1\le w\le 100\),\(1\le k\le 10^8\)。
4s 512MB
考虑树剖,考虑一个安全设施 \((p,k)\) 所在的那条重链上,那么它影响到的就是一个链上的区间。然后往上跳到 \(p'=\text{fa}_{\text{top}_p}\),在这里放置一个等效的安全设施,参数为 \((p',k'=k-\text{dis}(p,p'))\),将重链上的点二分出覆盖的区间,并更新每个点的被覆盖次数。往上以此类推。注意这里没有处理重链上轻子树的点,但是这些点在后续查询时会跳上来,依然会被计算。
查询 \((u,v)\) 时考虑分别计算 \((u,\text{lca}(u,v))\) 和 \((v,\text{lca}(u,v))\)。依旧往上跳,首先跳到根,在这些所有可能会影响到 \(u,v\) 的安全设施中找到影响最大的,即 \(\max\limits_{p'}\{k'-|s_u-s_{p'}|\}\),其中 \(s_i\) 是 \(i\) 到根路径的权值和,这个可以拆开绝对值后用线段树做单修区查。然后再在到 lca 的重链上依次检查。时间复杂度 \(O(q\log^2n)\)。
2025.11.25 OIFC
- 理想得分:100+28+100+24
- 期望得分:100+8+55+0
- 实际得分:100+4+60+0
种花 *1600
给定一个 \(n\times m\) 的 01 矩阵,求全 0 的子矩形个数,对 \(998244353\) 取模。
\(1\le n,m\le 1000\)。
1s 512MB
考虑计算以某个位置为右下角的矩形数量,按列扫过去可以用单调栈维护贡献。时间复杂度 \(O(nm)\)。
*喵了个喵
建造军营 *2600
给定一棵 \(n\) 个点的带权(\(w\))无根树,有 \(m\) 个互不重合的关键点初始分别位于 \(a_i\),每个关键点会覆盖到其距离 \(\le k\) 的点。现在将每个关键点分别调整到 \(a'_i\),需要花费 \(\sum\limits_{i=1}^m\text{dis}(a_i,a'_i)\) 的代价,并要求每个点都被某个关键点覆盖,最小化代价。
\(1\le a_i\le n\le 5000\),\(1\le m\le\min(n,100)\),\(1\le k\le\min(n-1,100)\),\(1\le w\le 10^9\)。
2s 512MB
考虑 dp。设 \(f_{x,i,t}\) 表示 \(x\) 子树内最终放了 \(i\) 个关键点,且最近未被关键点覆盖的点到 \(x\) 的距离为 \(t\) 的最小代价;\(g_{x,i,t}\) 表示 \(x\) 子树内最终放了 \(i\) 个关键点,且离 \(x\) 最近的关键点距离为 \(t\) 的最小代价。
设 \(i\) 子树原本的关键点数为 \(c_i\),\(x\) 的某个儿子 \(y\) 和其的连边 \((x,y)\) 的边权为 \(w\),那么如果 \(y\) 子树最终有 \(j\) 个关键点,就会产生 \(v=|c_y-j|\cdot w\) 的贡献。那么可以做树上背包,讨论这个 \(t\) 可以得到转移:
时间复杂度 \(O(nmk)\)。
比赛 *2800
给定长度为 \(n\) 的整数序列,\(q\) 次查询 \([l,r]\),求其所有子区间的最大子段和之和。对 \(2^{64}\) 取模。
\(1\le n,q\le 2.5\times10^5\),\(1\le l\le r\le n\),\(0\le |a_i|\le 10^9\)。
2s 1GB
首先套路地离线询问,按右端点从左到右扫描,维护每个左端点对应的历史和。
设 \(\text{sum}_i=\sum\limits_{j=1}^ia_j\)。假设当前扫描到 \([1,i]\),固定最大子段和的左端点 \(l\) 时,相当于要求 \(\text{sum}_l-\min\limits_{r=l}^{i}\{\text{sum}_r\}\)。考虑单调栈维护 \(\text{sum}_i\) 的前缀 \(\min\)。然后对应地在线段树上更新即可。时间复杂度 \(O((n+q)\log n)\)。
2025.11.27 OIFC
*异或
心 *2400
给定一棵 \(n\) 个点的树,断开任意条边所得到的森林,其权值为每个连通块重心个数的乘积。求所有 \(2^{n-1}\) 种断边方案所得到的权值之和。对 \(998244353\) 取模。
\(1\le n\le 5000\)。
2s 512MB
一棵树的重心个数只能是 \(1\) 或 \(2\),并且如果个数为 \(2\) 必然相邻,且这条边两侧的子树大小相同。那么乘积可以看作在每个连通块内是否选择了这样的一条边。
于是 dp。设 \(f_{x,i}\) 表示以 \(x\) 为根的连通块大小为 \(i\),当前还没有选出这样一条边的方案数;\(g_{x,i}\) 表示已经选出了这样一条边,且这条边两侧子树大小之差为 \(i\) 的方案数。然后就可以做树上背包了。设 \(\text{ans}_i\) 表示 \(i\) 子树的答案,\(y\) 为 \(x\) 的某一个儿子,枚举 \(x,y\) 的连通块大小 \(i,j\),那么可以得到如下这些转移式子:
时间复杂度 \(O(n^2)\)。
青鸟 *2400
给定一个 \(n\) 点 \(m\) 边的有向图,问有多少种加边方案(可以加重边、自环)使得从 \(1\) 开始任意走总能经过有限步到达 \(n\)。
\(1\le n\le 5\times 10^4\),\(1\le m\le 10^5\)。
3s 512MB
首先删去 \(n\) 的所有出边,那么可以容易得到合法的判定:\(1\) 不能走到环,且所能到达的所有点中除了 \(n\) 以外出度均要 \(>0\)。
要看图的可达性那直接大力 bitset 就好了。
考虑如何进行加边,对图的形态讨论:
- 若除了 \(n\) 以外 \(1\) 所能到达的出度为 \(0\) 的点不少于两个,或 \(1\) 初始可以走到环,则无解。
- 若除了 \(n\) 以外还存在一个 \(1\) 可达的出度为 \(0\) 的点,那么加的边起点一定是该点,而其重点需要满足能走到 \(n\) 且走不到其他出度为 \(0\) 的点。
- 否则的话 \(1\) 一开始就能到达 \(n\),讨论加的边的起点:
- 若起点 \(1\) 不可达,则终点任意。
- 若起点恰为 \(n\),则终点任意。
- 若起点 \(1\) 可达,则终点需要保证其可达 \(n\) 且不可达其他出度为 \(0\) 的点,以及不可达起点。
时间复杂度 \(O\left(\dfrac{n^2}w\right)\)。