Atcoder 题目选做(四)
\(\text{By DaiRuiChen007}\)
1. [AGC059C] Guessing Permutation for as Long as Possible
给定 \(\dfrac{n\times (n-1)}2\) 个 \([1,n]\) 中的二元对的顺序,求有多少个 \(n\) 阶排列 \(P\) 使得按顺序询问到每个 \((u,v)\) 之前无法确定 \(P_u,P_v\) 大小关系。
数据范围:\(n\le 400\)。
考虑一个询问 \((u,v)\) 时间为 \(w\),那么在 \(1\sim w-1\) 范围内不能有 \(u\to v\) 或 \(v\to u\) 路径。
手玩可以发现大部分这样的路径长度都为 \(2\),即 \(u\to x\to v\) 存在。
否则不妨考虑路径的一部分 \(u\to x\to y\to\cdots\to v\):此时如果 \((u,y)\) 之间的边权也 \(<w\) 那么就可以缩边,否则 \(u\to y\) 这条边也会导致排列非法。
那么我们只要对于所有 \(\max(t_{u,x},t_{x,v})<t_{u,v}\) 保证 \((u,x)\) 和 \((x,v)\) 不同向。
建立 2-SAT 后统计解数量即可,这个 2-SAT 只有相同或不同关系,可以直接并查集。
设 2-SAT 图联通块数量为 \(k\),那么答案就是 \(2^{k/2}\)。
时间复杂度 \(\mathcal O(n^2\alpha(n))\)。
2. [AGC059D] Distinct Elements on Subsegments
给定一个长度为 \(n+k-1\) 序列 \(a\) 所有长度为 \(k\) 的子区间的颜色数 \(b_1\sim b_n\),构造原序列或报告无解。
数据范围:\(n,k\le 2\times 10^5\)。
显然考虑差分 \(b_{i+1}-b_i\),显然我们只关心 \(a_{i+k}\) 在 \(a_{[i+1,i+k-1]}\) 中是否出现过,以及 \(a_i\) 是否在 \(a_{[i+1,i+k-1]}\) 中出现过。
分别记为 \(l_{i+k},r_i\),那么 \(b_{i+1}=b_i+r_i-l_{i+k}\)。
考虑如何刻画 \(l,r\),对于所有值相同的下标,我们把下表距离 \(<k\) 的匹配起来,那么右边的数 \(l_i=1\),左边的数 \(r_j=1\)。
那么存在一种排列 \(p_1\sim p_m\) 使得 \(l_{i}-r_{p_i}\in[1,k)\)。
通过观察可以猜测我们在 \(l,r\) 同时升序时取得一个最优的匹配。
然后考虑通过 \(l,r\) 构造原排列:如果 \(l_i=0\),那么取一个新的值,否则取对应的 \(a_{r_i}\) 的值即可,容易证明所有条件全部满足。
我们只要构造一组合法的 \(\{l_i\},\{r_i\}\) 即可。
显然 \(b_{i+1}-b_i\in\{1,-1,0\}\),如果 \(b_{i+1}-b_i\ne 0\) 那么 \(l_{i+k},r_i\) 直接确定,否则我们要考虑 \(l_{i+k},r_i\) 同时取 \(1\) 还是 \(0\)。
容易猜测取 \(l_{i+k}=r_i=1\) 时更优,可以证明错位之后一定不会更劣,当且仅当 \(b_{i}=k\) 时不能取 \(l_{i+k}=r_i=1\)。
最后只有 \(l_{[1,k]}\) 和 \(r_{[n,n+k-1]}\) 未处理,而他们的唯一限制就是 \(b_1=k-\sum_{i=1}^k l_i\) 和 \(b_n=k-\sum_{i=n}^{n+k-1} r_i\)。
那么贪心来说肯定把 \(l,r\) 取靠近中间值(\(l_i\) 往右,\(r_i\) 往左)即可。
时间复杂度 \(\mathcal O(n+k)\)。
3. [AGC059E] Grid 3-coloring
给定 \(n\times n\) 矩阵 \(C\),其最外圈的 \(4n-4\) 个格子已经被 \(3\) 染色,问中间部分能否 \(3\) 染色。
数据范围:\(n\le 2\times 10^5\)。
题目的限制我们可以看成一个 \(n\times n\) 的矩阵 \(A\),相邻元素差 \(\in\{1,-1\}\),然后把这个矩阵 \(\bmod 3\) 得到的结果,可以证明固定 \(a_{1,1}=c_{1,1}\) 后总有唯一的 \(A\) 与 \(C\) 对应 。
对于最外圈的值,还原 \(C\to A\) 是简单的:从任意一个点出发,邻居和他的 \(+1/-1\) 关系是确定的。
如果这个环最终相邻元素差 \(\ne 0\) 显然无解。
进一步的还有显然的限制:\(|a_{i,j}-a_{u,v}|<|i-j|+|u-v|\)。
对于这个问题,显然我们只要考虑对边上的两个点,并且只要考虑 \((a_{i,1},a_{i,n})\) 之间的关系,因为同一行的 \(|a_{i,1}-a_{j,1}|<|i-j|\) 显然成立。
可以证明满足这两个条件后总能从外圈构造出合法矩阵:
首先能够证明 \(a_{i,j}\) 在四个边界上取值不变。
然后对于任意两个邻居,容易发现每个元素变化量 \(\in[-1,1]\) 且奇偶性全部变化。
那么可以证明相邻两个数差一定 \(\in\{-1,1\}\)。
因此只要判断能否成环和对边是否满足条件。
时间复杂度 \(\mathcal O(n)\)。
*4. [AGC059F] LIDS
求有多少 \(n\) 阶排列 \(p\) 满足 \(\mathrm{LIS}(p)+\mathrm{LDS}(p)=n+1\) 且 \(p_x=y\)。
数据范围:\(n\le 5\times 10^6\)。
先考虑只有第一个条件的情况,考虑用杨表刻画:那么该排列对应的杨表就是只有一行一列的杨表,可以根据钩长公式算出结果,然后把两个同形态杨表和一个排列双射得到:
考虑另一种方法刻画这些排列:
画出一个 \(n\times n\) 网格,那么不在边界上的格线横纵各 \(n-1\) 条。
选定一个 \(k\) 和分别 \(k\) 条横纵格线,按横格线从上到下,纵格线从左到右的顺序匹配,得到 \(k\) 个匹配相交格点(记为红格点)。
对于剩下的 \(n-k-1\) 条横纵格线,按横格线从上到下,纵格线从右到左的顺序匹配,得到 \(n-k-1\) 个匹配相交格点(记为黑格点)。
对于一个红格点,如果其左上部分没有黑格点,那么染红他左上方的格子,如果其右下部分没有黑格点,那么染红他右下方的格子。
对于一个黑格点,如果其左下部分没有红格点,那么染黑他右下方的格子,如果其右上部分没有红格点,那么染黑他右上方的格子。
如果有 \(<n\) 个格子被染色,可以证明一定是 \(n-1\) 个格子被染色,把剩下来的一行一列的交点染色。
一种可能的操作方式如下图:
通过观察和手玩可以证明如下事实:
- 红格子纵坐标递减,黑格子坐标递增。
- 红格点构成的折线和黑格点构成的折线至多一个交点。
- 最后一步前有恰好 \(n-1/n\) 个格子被染色。
- 对应生成的排列 \(\mathrm{LIS}+\mathrm{LDS}=n+1\)。
- 任何一个合法的排列都能还原成这样的一个矩阵。
那么我们就把 \(\mathrm{LIS}+\mathrm{LDS}=n+1\) 的排列和在网格图中选一些格线的过程形成了一个双射(容易验证两者总方案数相等)。
那么考虑有多少种方法使得 \((x,y)\) 这个格子被染色。
假如该格子被左上方的红格点染色。
那么不妨假设前 \(x-1\) 条横线和 \(y-1\) 条竖线共选了 \(i\) 个(包含第 \(x/y\) 条)。
那么我们要使得右下方没有黑格子,那么右侧 \(n-x\) 条横格线至多有 \(y-1-i\) 个未被选中,同理下方 \(n-y\) 条纵格线至多有 \(x-1-i\) 个未被选中。
那么右下方至少要选择 \(n-x-y+i+1\) 个红色格点,可以通过组合数后缀和求出。
类似如果我们要让 \((x,y)\) 被右下方红格点染色,我们可以直接对称网格令 \((x,y)\gets(n-x+1,n-y+1)\) 然后再做一遍上面的过程即可。
然后考虑 \((x,y)\) 四个邻居全部未被染色,\((x,y)\) 是最后一步覆盖到的点。
那么这要求红格点都在 \((x,y)\) 左上或右下,黑格点都在 \((x,y)\) 左下或右上。
即在上面的基础上要求右下方恰好选择 \(n-x-y+i+1\) 个红色格点,为了防止算重,我们可以钦定在前一种情况中右下方红色格点数 \(\ge n-x-y+i+2\)。
那么依次计算组合数即可。
时间复杂度:\(\mathcal O(n)\)。
5. [ABC275G] Infinite Knapsack
给定个 \(n\) 个物品,每种无穷多个,有两维代价 \(a_i,b_i\) 和收益 \(c_i\),\(f(x)\) 表示 \(\sum a_i,\sum b_i\) 分别 \(\le x\) 的情况下最大的 \(\sum c_i\),求 \(\lim_{x\to+\infty}\dfrac{f(x)}x\)。
数据范围:\(n\le 2\times 10^5\)。
先求出每种物品的“性价比”\(x_i=\dfrac{a_i}{c_i},y_i=\dfrac{b_i}{c_i}\),以及每种物品的占比 \(p_i\),其中 \(\sum p_i=1\)。
那么答案可以表示为 \(\max(\sum x_ip_i,\sum y_ip_i)^{-1}\),感性理解就是想要 \(1\) 的收益,\(a\) 类体积为 \(\sum x_ip_i\),\(b\) 类体积为 \(\sum y_ip_i\)。
那么我们只要求 \(\max(\sum x_ip_i,\sum y_ip_i)\) 的最小值,二分一个 \(k\),由于 \(\sum p_i=1\),因此我们只要求 \(\sum (x_i-k)p_i,\sum(y_i-k)p_i\le 0\)。
如果存在 \(i\) 使得 \(x_i,y_i\le k\) 那么取 \(p_i=1\) 即可。
考虑把这些向量画在二维平面上,那么很自然的发现我们只要最靠近第三象限的两个向量(二、四象限各一个)。
具体来说就是 \(x_i<k\) 且 \(\dfrac{y_i-k}{k-x_i}\) 最小和 \(y_i<k\) 且 \(\dfrac{x_i-k}{k-y_i}\) 最小。
判断这些向量过第三象限得到那个夹角是否 \(\le \pi\) 即可,也可以直接看成 \(n=2\) 的问题,解一元一次不等式组解决。
时间复杂度 \(\mathcal O(n\log V)\)。
6. [ABC275Ex] Monster
给定 \(a_1\sim a_n,b_1\sim b_n\),令 \(a_{[l,r]}\) 区间 \(-1\) 的代价是 \(\max b_{[l,r]}\),求令所有 $a_i\le0 $ 的最小代价。
数据范围:\(n\le 10^5,a_i,b_i\le 10^9\)。
考虑线性规划,设 \(x_{l,r}\) 表示操作 \([l,r]\) 执行了几次:
设对偶变量为 \(y_1\sim y_n\),线性规划对偶得到:
这就相当于可以选择若干 \(a_i\),但 \([l,r]\) 总共不能选择超过 \(\max b_{[l,r]}\) 个数,求最大权值。
看到区间最大值很自然想到笛卡尔树,我们发现有意义的限制一定是笛卡尔树上的极大区间,那么我们只要限制每个 \(u\) 在笛卡尔树的子树内至多选 \(b_u\) 个点。
那么就可以树形 dp 了,\(f_{u,i}\) 表示 \(u\) 子树选 \(i\) 个点的最大答案,初始 \(f_{u,i}=i\times a_u\),然后和 \(f_{ls},f_{rs}\) 作 \((\max,+)\) 卷积,最后保留前 \(b_u\) 项。
注意到 \(f_u\) 初始为一条直线,那么若干次卷积之后一定还是斜率递增的凸壳。
可以用闵可夫斯基和维护,每次归并差分数组,注意到初始态每个点差分数组都是相同的一段,把所有斜率相同的连续段用优先队列存下来,转移时先启发式合并,然后弹掉最小的若干段使得总长 \(\le b_u\) 即可。
时间复杂度 \(\mathcal O(n\log^2n)\)。
7. [AGC060C] Large Heap
给定 \(n\),随机生成一个深度为 \(n\) 的小根堆,权值为 \(1\sim 2^n-1\) 的排列。
求第 \(a\) 层最左边节点 \(u\) 值小于第 \(b\) 层最右边节点的值 \(v\) 的概率。
数据范围:\(n\le 5000\)。
先考虑有多少个深度为 \(n\) 的小根堆,最小值显然在根上,然后只要把 \(2^n-2\) 个数均分到左右子树里,有递推关系:
考虑如何用类似的过程解决原本的问题:我们把 \(u,v\) 到根的路径分别取出来,并设两个指针 \(x=u,y=v\),我们只需要维护 \(V=\mathrm{subtree}(x)\cup\mathrm{subtree}(y)\) 之内的大小关系。
每次我们取出 \(fa(x),fa(y)\) 中较大的一个(不妨设是 \(x\)),然后把 \(x\) 的兄弟的值域和 \(V\) 的值域合并一下即可。
那么考虑用 dp 维护这个过程,\(dp_{i,j}\) 表示当前 \(x\) 子树深度为 \(i\),\(y\) 子树深度为 \(j\) 的合法概率,对应的方案数 \(F_{i,j}=dp_{i,j}\times f_i\times f_j\times \binom{2^i+2^j-2}{2^i-1}\)。
转移时枚举上一步加入的是 \(x\) 还是 \(y\),然后把新的子树和原本值域合并一下:
展开所有组合数并化简可以得到:
边界条件 \(dp_{n-a-1,\ge n-b}=1\),转移之前 \(\mathcal O(n^2)\) 预处理所有逆元即可。
时间复杂度 \(\mathcal O(n^2)\)。
8. [AGC060D] Same Descent Set
求有多少个 \(n\) 阶排列对 \((p,q)\) 使得 \((p_{i+1}-p_i)(q_{i+1}-q_i)>0\) 恒成立。
数据范围:\(n\le 2\times 10^5\)。
定义排列 \(p\) 的 Descent Set 为 \(D(p)=\{i\mid p_i>p_{i+1}\}\)。
设 \(f(S)\) 表示 \(D(p)=\overline S\) 的排列数,\(g(S)\) 表示 \(\overline{D(p)}\subseteq S\) 的方案数,即钦定 \(\overline S\) 中的元素一定是 Descent 的。
那么设 \(g(S)=\{s_1,s_2,\dots,s_k\}(s_i<s_{i+1})\),那么 \(\overline S\) 中的元素构成若干连续段,每个连续段内都是严格递减的,我们只需要把 \(n\) 个元素分到每个连续段内即可 \(g(S)=\dfrac{n!}{s_1!(s_2-s_1)!\cdots(n-s_k)!}\)。
根据容斥原理我们有 \(f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T)\),化简一下答案:
最后几步的组合意义是:已知 \(T_1,T_2\),满足 \(T_1\cup T_2\subseteq S\) 的 \(S\) 只有 \(2^{n-1-|T_1\cup T_2|}\),然后容斥原理拆开化简。
根据 \(g(T)\) 的组合意义,我们可以看成先枚举 \(Q\subseteq T_1\cap T_2\),把 \(1\sim n\) 划分成若干段,然后每一段内用 \(T_1\) 和 \(T_2\) 分别切割一遍,切割的段长为 \(k\),那么就有一个 \(\dfrac{1}{-2k!}\) 的系数。
注意到此时一个 \(T_1\cap T_2\) 的每个子集都会算一次 \((T_1,T_2)\) 的贡献,此时总贡献恰好为 \(2^{|T_1\cap T_2|}\)。
因此设 \(g_i\) 表示单个 \(T\) 分 \(i\) 阶排列的答案,那么 \(g_i=\sum_{j<i}\dfrac{g_j}{-2(i-j)!}\)。
设 \(f_i\) 表示 \(i\) 阶排列的答案,那么 \(f_i=\sum_{j<i} f_jg^2_{i-j}\)。
答案为 \(2^{n+1}n!^2f_n\),两次分治 NTT 计算即可。
时间复杂度 \(\mathcal O(n\log^2n)\)。
*9. [AGC060E] Number of Cycles
记 \(f(p)\) 表示排列 \(\{p_i\}\) 形成的环数。
给定 \(n\) 阶排列 \(a\),构造排列 \(b\) 使得 \(f(b)+f(b\circ a)=k\)。
数据范围:\(n\le 2\times 10^5\)。
设 \(c=b\circ a\),观察到交换 \(b_i,b_j\) 同时也会交换 \(c_i,c_j\)。
因此 \(f(b)+f(c)\) 的单次变化量一定是偶数(\(\pm 2\) 或 \(0\))。
先考虑 \(f(b)+f(c)\) 的最大值:猜测在 \(b_i=i\) 时取得,此时最值为 \(n+f(a)\),事实上这是可以证明的:
假设最大值在 \(f(b)<n\) 时取得,那么每次交换 \(b_i,b_j\) 使得 \(f(b)\) 变大,\(f(b)+f(c)\) 一定不降,那么一定有一组最大值在 \(b_i=i\) 时取得。
因此 \(k\) 的奇偶性不同于 \(n+f(a)\) 或者 \(>n+f(a)\) 一定无解。
接下来考虑 \(f(b)+f(c)\) 的最小值,显然理论最小值是 \(2\),尝试构造:
- 对于每个 \(i\),选择一个没有入度的 \(j\) 使得当前 \(j,i\) 在当前 \(b\) 中不连通,且 \(p_j,i\) 在当前 \(c\) 中不连通。
- 注意到这样的操作至多导致两个 \(j\) 不能选,因此对于 \(1\le i\le n-2\),这样的 \(j\) 总是存在。
- 对于 \(i=n-1\),我们至少可以选一个 \(j\) 使得 \(j,i\) 在当前 \(b\) 中不连通,这一步至多导致 \(+1\) 个环。
- 对于 \(i=n\) 至多导致 \(+2\) 个环。
因此 \(f(b)+f(c)\) 的最小值 \(\le 3\),那么最小值为 \(2/3\),根据 \(n+f(a)\) 的奇偶性可以决定。
此时 \(f(b)=1\),考虑每次操作令 \(f(b)\gets f(b)+1\),那么 \(n-1\) 步之后 \(f(b)+f(c)\) 会取到最大值,且每次变化量 \(\in\{0,2\}\)。
设 \(2\mid n+f(a)\),那么这个过程中的 \(f(b)+f(c)\) 会取遍 \([2,n+f(a)]\) 中所有偶数,即 \(k\) 的所有可能值。
那么我们只要在这 \(n-1\) 个排列中找到一个 \(b\) 满足 \(f(b)+f(c)=k\)。
注意到每次 \(f(b)+f(c)\) 单调不降,二分操作次数判断 \(f(b)+f(c)\) 与 \(k\) 的关系即可。
时间复杂度 \(\mathcal O(n\log n)\)。
*10. [AGC060F] Spanning Trees of Interval Graph
给定若干 \([1,n]\) 的子区间,其中区间 \([l,r]\) 共有 \(c_{l,r}\) 个,每个区间对应一个节点,两个节点连边当且仅当他们对应的区间有交,求这张图的生成树个数。
数据范围:\(n\le 400\)。
设共有 \(m\) 个区间,第 \(i\) 个为 \(S_i=[l_i,r_i]\),记 \(G_{i,j}=[S_i\cap S_j\ne\varnothing],D_{i,i}=\sum_j G_{i,j}\)。
设 \(G,D\) 分别表示对应矩阵删掉第一行第一列后的结果,那么根据矩阵树定理,答案就是 \(\det(D-G)\)。
注意到这里我们考虑了自环的贡献,但是此时 \(G_{i,i},D_{i,i}\) 各多算了 \(1\),相减后无影响。
显然直接维护该行列式不太可能。
考虑矩阵行列式引理:\(\det(A+uv^T)=\det A(1+v^TA^{-1}u)\),其中 \(A\) 可逆,\(u,v\) 是 \(1\times n\) 向量。
事实上对于 \(u,v\) 为 \(k\times n\) 矩阵时,该引理也成立,我们有 \(\det(A+uv^T)=\det A\det(I+v^TA^{-1}u)\),其中 \(I\) 为 \(k\) 阶单位矩阵。
带入原题,我们要分解 \(G=uv^T\),然后把答案变成 \(\det D\det(I-v^TD^{-1}u)\),其中 \(D\) 是对角线矩阵,因此求逆和求值都是简单的。
因此我们只要解决分解问题即可。
注意到 \(G_{i,j}=[S_i\cap S_j\ne\varnothing]\),注意到 \(S_i\cap S_j\) 是一个区间,而判断一个区间是否为空可以看成区间内点数减去边数。
那么我们用 \(2i-1\) 表示第 \(i\) 个点,\(2i\) 表示 \([i,i+1]\) 这条边。
那么对于 \(i\in S_j,u_{2i-1,j}=v_{2i-1,j}=1\),对于 \(\{i,i+1\}\in S_j,u_{2i,j}=1,v_{2i,j}=-1\),此时 \(k=2n-1\)。
此时暴力求行列式的复杂度为 \(\mathcal O(n^3)\) 可以接受,我们只要算出矩阵 \(T=v^{-1}D^{-1}u\) 即可。
考虑每个区间 \([l,r]\),那么 \(\det D=\prod_{l,r}d_{l,r}^{c_{l,r}}\),而该区间对 \(T_{i,j}\) 的贡献就是 \(\dfrac{c_{l,r}}{d_{l,r}}\times(-1)^{j-1}\),要求 \(i,j\in[2l-1,2r-1]\)。
可以看成有 \(c_{l,r}\) 条 \(i\to j\) 的边,其中走到 \(j\) 的边自带符号 \((-1)^{j-1}\),又有一个边权 \(\dfrac{1}{d_{l,r}}\)。
每个区间对 \(T_{[2l-1,2r-1],j}\) 都修改都是相同的,可以直接差分,而 \(d_{l,r}\) 可以直接前后缀和求出。
时间复杂度 \(\mathcal O(n^3)\)。
11. [ABC276Ex] Construct a Matrix
给定 \(n\times n\) 的 012 矩阵 \(A\),\(q\) 个限制要求 \(A_{[a,b],[c,d]}\) 子矩阵的元素乘积 \(\bmod\ 3=e\),构造一组解。
数据范围:\(n,q\le 2000\)。
先处理 \(e=0\) 的情况,如果 \(e\ne 0\) 那么 \(A_{[a,b],[c,d]}\) 均不能是 \(0\),那么剩下的位置全部填 \(0\) 肯定可以尽可能满足 \(e=0\) 的要求,二维前缀和维护,有 \(e=0\) 子矩阵所有元素均被钦定非 \(0\),那么肯定无解。
否则可以看成 \(1,-1\) 矩阵,再看成 \(01\) 矩阵异或和为 \([e=2]\)。
那么可以用异或方程组解决,但是变量有 \(n^2\) 个,前缀和优化一下,每次只涉及 \(4\) 个变量,离散化后至多 \(4q\) 个变量 \(q\) 条限制,std::bitset
优化高斯消元即可。
时间复杂度 \(\mathcal O(n^2+\dfrac{q^3}\omega)\)
12. [ABC277Ex] Constrained Sums
构造 \(x_1\sim x_n\in[0,m]\) 满足 \(q\) 个限制:\(x_u+x_v\in[l,r]\)。
数据范围:\(n,q\le 1000,m\le 100\)。
首先可以考虑 2-SAT 模型,\(x_u=i\) 时对于 \(x_v<l-x_u\) 或 \(x_v>r-x_u\) 的点不可能,注意到每次操作都是单点对前后缀连边。
那么可以用前后缀优化建图,记 \(y_{u,i}=[x_u\ge i]\),那么连边就是 \(y_{u,i}\to \overline{y_{v,r-i+1}},\overline{y_{u,i}}\to y_{v,l-i+1}\),直接 Tarjan 解出即可。
时间复杂度 \(\mathcal O((n+q)m)\)。
13. [ARC158D] Equation
\(T\) 次询问给定 \(n,p\),构造 \((x,y,z)\) 使得:
\[(x+y+z)(x^n+y^n+z^n)(x^{2n}+y^{2n}+z^{2n})\equiv x^{3n}+y^{3n}+z^{3n} \pmod p \]数据范围:\(n,p\le 10^9,p\ge 5\)。
注意到左右均为齐次多项式,且次数恰好差 \(1\),那么我们假设 \(\mathrm{LHS}=k\times \mathrm{RHS}\),那么取 \(\left(\dfrac xk,\dfrac yk,\dfrac zk\right)\) 就能满足题意。
不断随机 \(x,y,z\) 直到 \(x\ne y\ne z,\mathrm{LHS}\ne 0,\mathrm{RHS}\ne 0\)。
感性理解不合法的 \(x,y,z\) 远小于 \(\mathcal O(p^3)\) 量级,应该期望 \(\mathcal O(1)\) 次操作就能得到解(可以证明成功率 \(\ge 75\%\))。
时间复杂度 \(\mathcal O(T\log p)\)。
14. [ARC158F] Random Radix Sort
给 \(n\) 个十进制 \(k\) 位数,\(m\) 次操作,每次选一个位 \(d\in[0,k)\),按第 \(d\) 位上的值从小到大进行稳定排序。
求最终让 \(a_1\sim a_n\) 变成 \(b_1\sim b_n\) 的方案数。
数据范围:\(n\le 2\times 10^5,k\le 18\)。
首先同一个 \(d\) 操作多次,只有最后一次操作有意义,因此我们只要计数长度 \(\le k\) 的排列即可。
对于一个长度为 \(i\) 的排列,把他们填进长度为 \(m\) 的序列且每种颜色最后一项满足顺序要求方案数就是 \(\begin{Bmatrix}m\\i\end{Bmatrix}\)(第二类斯特林数),即把 \(m\) 个下标分成 \(i\) 个颜色,颜色之间按最大下标自动定序。
接下来只要考虑一些排列是否合法即可。
由于基数排序不改变值相等的数的相对顺序,因此我们能知道 \(b_i\) 究竟是原来的那个元素 \(a_{p_i}\)。
对于每一对 \((b_i,b_{i+1})\),设 \(S_i=\{j\mid b_{i,j}<b_{i+1,j}\},T_i=\{j\mid b_{i,j}>b_{i+,j}\}\)。
显然为了保证他们的相对顺序,我们要求所有 \(T_i\) 中最后一个元素出现早于 \(S_i\) 中最后一个元素出现。
但这并不够,如果 \(p_i>p_{i+1}\),我们们要求 \(S_i\) 中至少有一个元素被选。
然后就可以 dp 了,从后往前考虑排列 \(f_{s}\) 表示当前排列的后缀时 \(s\) 的答案。
加入 \(k\) 时我们要求 \(\forall k\in T_{x},S_x\cap s=\varnothing\),这个可以快速判定,维护所有 \(S_x\) 的超集,并判断其中是否有 \(\overline s\) 即可,用高维前缀和维护即可。
最后统计答案类似,维护所有 \(p_i>p_{i+1}\) 的 \(S_i\) 的超集,如果 \(\overline s\) 不在其中就把答案加上 \(dp_s\times \begin{Bmatrix}m\\|s|\end{Bmatrix}\)。
第二类斯特林数可以用容斥原理暴力算。
时间复杂度 \(\mathcal O(n\log n+nk+k^22^k)\)。
15. [AGC061B] Summation By Construction
把一个 \(K_{n,n+1}\) 的完全二分图分成 \(n\) 条简单路径,第 \(i\) 条长度为 \(2i\)。
数据范围:\(n\le 100\)。
先考虑 \(n\) 为奇数的情况。
在邻接矩阵上划分路径,我们可以构造出得到如下的阶梯型结构:
我么可以把这个 \(n\times (n+1)\) 的网格划分成 \(\dfrac{n+1}2\) 个长度为 \(2n\) 的阶梯。
把每个阶梯拆成大小为 \((1,n-1),(2,n-2),(3,n-3),(4,n-4),\dots\) 的两个子阶梯即可。
然后考虑 \(n\) 是偶数的情况,此时依然要划分阶梯的话就要考虑纵向划分:
我们能划分成一个长度为 \(n\) 的阶梯,一个长度为 \(n-1\) 的阶梯,还有 \(\dfrac{n}2-2\) 个长度为 \(n+1\) 的阶梯。
把这些长度为 \(n+1\) 的阶梯划分成 \((3,n-2),(4,n-3),\dots\) 的两个子阶梯即可。
剩下的六个空位放 \(1,2\) 即可。
时间复杂度 \(\mathcal O(n^2)\)。
16. [AGC061C] First Come First Serve
给定 \(a_1\sim a_n,b_1\sim b_n\) 构成 \(1\sim 2n\) 的排列,且 \(a_i<b_i,a_i<a_{i+1},b_i<b_{i+1}\)。
令 \(t_i\in\{a_i,b_i\}\),求 \(t_i\) 的相对顺序有多少种可能。
数据范围:\(n\le 5\times 10^5\)。
对于一对 \((a_i,b_i)\),选 \(a_i,b_i\) 等价当且仅当 \([a_i,b_i]\) 中间没有其他 \(t_j\)。
因此我们可以用 dp 容斥掉这种情况,\(dp_{i}\) 表示选择了 \(t_1\sim t_i\) 的方案数。
那么 \(dp_i\gets 2dp_{i-1}\),然后找到最大的 \(b_j<a_i\) 和 \(a_k<b_i\),那么我们想要容斥掉 \([a_i,b_i]\) 就要求 \((j,k]\) 区间选择一定,因此转移 \(dp_k\gets -dp_j\)。
双指针求解即可。
时间复杂度 \(\mathcal O(n)\)。
17. [AGC061D] Almost Multiplication Table
给定 \(n\times m\) 矩阵 \(a\),构造单调递增数列 \(x_1\sim x_n,y_1\sim y_m\) 最小化 \(\sum_{i,j}|a_{i,j}-x_iy_j|\)。
数据范围:\(n,m\le 5,a_{i,j}\le 10^9\)。
先二分 \(k\),那么相当于 \(l_{i,j}\le x_iy_j\le r_{i,j}\),其中 \(l_{i,j}=\max(0,a_{i,j}-k),r_{i,j}=a_{i,j}+k\)。
不妨假设 \(x_n\le y_m\),那么考虑调整法,从最极端情况 \(a_i=1,y_i=+\infty\) 开始调整,且每次都进行尽可能少的调整:
- 从小到大考虑 \(x_i\),将 \(x_i\) 与 \(x_{i-1}+1\) 和 \(\left\lceil\dfrac{l_{i,j}}{y_j}\right\rceil\) 取 \(\max\)。
- 从大到小考虑 \(y_j\),将 \(y_j\) 与 \(y_{j+1}-1\) 和 \(\left\lfloor\dfrac{r_{i,j}}{x_i}\right\rfloor\) 取 \(\min\)。
- 如果 \(x_n>y_m\) 或 \(y_1<1\) 无解,如果当前 \(x,y\) 合法那么结束。
然后交换 \(x,y\) 再做一次。
感性理解一下这个算法的正确性:首先我们每次都进行了尽可能少的调整,那么 \(x_i\) 一定小于任何一组合法的 \(x\),\(y_i\) 一定大于任何一组合法的 \(y\),那么每次调整直到 \(x_n>y_m\) 就说明这个区间里根本夹不到任何一组解。
然后分析一下复杂度,我们时刻都有 \(x_ny_m\le r_{n,m}\),且 \(x_n\le y_m\),那么 \(x_n\) 最多 \(\mathcal O(\sqrt V)\) 级别。
由于 \(x_i\) 递增,那么总和为 \(\mathcal O(n\sqrt V)\),且每次不可能让所有 \(x\) 都不变,因此调整总数为 \(\mathcal O(n\sqrt V)\)。
复杂度 \(\mathcal O(nm(n+m)\sqrt V\log V)\)。
*18. [AGC061E] Increment or XOR
给定 \(x\),以及 \(n\) 个操作 \((q_i,w_i)\),你可以进行如下操作:
- \(x\gets x+1\) 代价为 \(c\)。
- \(x\gets x\oplus q_i\) 代价为 \(w_i\)。
求让 \(x\) 从 \(s\) 变成 \(t\) 的最小代价。
数据范围:\(n\le 8,s,t,q_i\le 2^{40}\)。
考虑观察结构:先看最高位 \(k\),注意到每次进位后低 \(k-1\) 位都会全部变成 \(0\),按照 \(k-1\) 每次进位分割,从 \(s_k\) 开始,每次进位之前第 \(k\) 位都是 \(0\),然后变成 \(1\),最终成为 \(t_k\)(且不能进位)。
那么观察第 \(k-1\) 位需要哪些结构:我们需要考虑从 \(s_k\) 开始的情况,由于每次进位后相当于从 \(s=0\) 重新出发,因此还要考虑从 \(0\) 开始的情况,而最终要么到达 \(t_k\) 要么进位变成 \(2^k\)(低 \(k-1\) 位全部变成 \(0\))。
不断递归,我们可以大概得出一个子结构:\(f_{k,x,y,S}\) 表示当前考虑了 \(k\) 位,\(S\) 是使用次数位奇数的异或操作数,\(x\in\{0,1\}\) 表示起点是 \(s_k/0\),\(y\in\{0,1\}\) 表示终点是 \(t_k/2^{k+1}\)。
先考虑边界条件:\(f_{-1,x,y,S}=w_S+y\times C\)(\(w_S\) 表示 \(S\) 内部操作之和)。
每次转移 \(f_{k-1}\to f_k\) 考虑两种情况:有进位或没进位。
如果没进位,那么要求 \(x\) 对应的起点异或上 \(S\) 内的元素得到第 \(k\) 位恰为 \(y\) 对应的终点(\(y=1\) 时要求第 \(k\) 位恰好为 \(1\),这样加上进位后还能向 \(k+1\) 进位)。
如果有进位那么相当于 \(f_{k+1,x,y,\oplus_{i=1}^m S_i}\gets f_{x,1,S_1}+ f_{1,1,S_2}+\cdots+f_{1,1,S_{m-1}}+f_{1,y,S_m}\),即中间每次都在进位,但是不能对高位有影响,因此中间部分每个 \(S_i\) 第 \(k\) 位必须是 \(1\),这样就能通过异或消掉 \(f_{k,1,1,S_{i-1}}\) 进位的贡献,然后再接受 \(f_{k,1,1,S_i}\) 的进位且保持不对更高位进位。
注意到转移形式类似最短路,Dijkstra 处理即可。
时间复杂度 \(\mathcal O(2^{2n}\log V)\)。
*19. [AGC061F] Perfect Strings
定义一个 01 串是好的当且仅当串中 1 的个数是 \(n\) 的倍数,0 的个数是 \(m\) 的倍数。
求有多少个好的 01 串使得他的任何一个子串都不是好的。
数据范围:\(n,m\le 40\)。
把 01 串看成格路,\((x,y)\) 加入 0 变成 \((x+1\bmod m,y)\),加入 1 变成 \((x,y+1\bmod n)\)。
那么我们要求的就是经过 \((0,0)\) 的回路且不重复经过格点。
看成在 \(n\times m\) 网格上不断移动,我们可以看成若干条从左下边界走到右上边界的路径,且起点终点互相匹配,那么整个回路可以被划分成若干个不相交的段,如下图:
假设我们枚举所有起点,那么终点确定,且由于路径互不相交,那么所有起点从左上到左下再到右下按顺序与终点从左上到右上到右下按顺序匹配。
注意 \((0,0)\) 的左侧入口和下侧入口必须恰有一个被选,不妨假设是左侧入口,然后交换 \(n,m\) 再做一次即可。
那么这个问题就很简单了,只要做一次 LGV 引理就能解决,但是注意 LGV 引理对应的行列式为有符号 \((-1)^{\mathrm{inv}(p)}\),上面的例子里 \(p=\{4,5,6,1,2,3\}\),设横向入口有 \(i\) 个,纵向入口有 \(j\) 个,那么 \(\mathrm{inv}(p)=ij\)。
接下来要处理原问题,主要问题就是要处理某些起点终点可以不选,还要统计起点中横向纵向的数量。
那么我们把这样可以跳过的起点直接连向终点,剩下的起点如果是横向的就把权值 \(\times x\),纵向 \(\times y\),得到一个二元形式幂级数 \(F(x,y)\),得到 \(\sum (-1)^{ij} [x^iy^j]F(x,y)\) 就是答案。
具体的转移网格构造出来如下图:
可以验证加入若干个直接匹配的排列,依然不改变每个路径的逆序对数,符号依然是 \((-1)^{ij}\)。
那么我们只要求出这个网格图上对应 LGV 引理矩阵的值,由于答案是一个二元生成函数,那么我们可以用拉格朗日插值优化,带入 \(x=1\sim n+1,y=1\sim m+1\) 求出每个点值,然后对相同的 \(x\) 插一次值,然后对相同的 \(y\) 插一次值即可得到答案。
时间复杂度 \(\mathcal O(nm(n+m)^3)\)。
20. [ABC278Ex] make 1
一个非负整数序列 \(S\) 是好的,当且仅当 \(S\) 存在一个非空子序列 \(T\),满足 \(T\) 中所有元素的异或和为 \(1\)。
有一个初始为空的序列 \(A\),以及 \(2^m\) 张写着数字的卡片;卡片上的数字取遍 \([0, 2^m)\) 中的整数。你可以自由选择一张卡片,将这张卡片上的数字放在 \(A\) 序列的末尾,并删除这张卡片,以后不能再选择它。你会一直进行这个操作,当 \(A\) 成为好的序列后停止。
给定 \(n, m\),求停止操作时长度为 \(n\) 的不同 \(A\) 序列数。
数据范围:\(n\le 2\times 10^5,m\le 10^7\)。
考虑一步一步解开题目的限制。
首先不断插卡片的过程相当于限制 \(A\) 中元素各不相同。
首先我们可以容斥,设 \(F_n\) 表示长度为 \(n\) 的好序列个数,那么我们要求该序列的 \(n-1\) 前缀不是好序列,那么就是答案就是 \(F_n-(2^m-n+1)F_{n-1}\)。
然后考虑反面考虑 \(f_n=(2^m)^{\underline n}-F_n\) 表示不好的序列数量。
那么进一步我们要处理掉元素各不相同的限制,可以设 \(g_n\) 表示没有这个限制的序列数。
那么 \(f_k\to g_n\) 的贡献系数就是把 \(n\) 个下标划分到 \(k\) 个集合中,即第二类斯特林数 \(\begin{Bmatrix} n\\k\end{Bmatrix}\),根据斯特林反演,我们得到:
那么我们只要求出 \(g_1\sim g_n\) 和第一类斯特林数的一行。
第二个问题是经典的,直接用倍增和多项式平移求出 \(x^{\overline n}\) 的各项系数即可。
而 \(g_n\) 就是 CF1603F 中 \(x=1\) 的情况:
一遍卷积即可。
时间复杂度 \(\mathcal O(n\log n)\)。