\(\text{By DaiRuiChen007}\)
1. [ARC152E] Xor Annihilation
Problem Link
给 \(2^n-1\) 个动点,权值为 \(1\sim 2^n-1\) 的排列,对于每个点,设其左右两边所有点权异或和分别为 \(L,R\),那么他会向较大 \(L/R\) 较大的一边移动,如果 \(L=R\) 则静止不动。
所有点运动速度一定,如果两个点相遇那么他们会合成一个新点,权值为他们的异或和。
在左右无穷点处放两个权值为 \(x\) 的静点(\(x\in[0,2^n)\))求有多少 \(x\) 使得最终所有点都静止。
数据范围:\(n\le 18\)。
注意到权值异或总和为 \(0\),因此设前缀异或和为 \(s_i\),那么 \(i\) 左边和右边的点权异或和就是 \(s_{i-1}\) 和 \(s_i\)。
那么如果两个点 \(i,i+1\) 合成之后相当于删掉 \(s_i\),这要求 \(s_i\ge s_{i-1}\) 且 \(s_i\ge s_{i+1}\) 且三个数不全相等。
那么整个排列会不断操作直到所有 \(s\) 相等或呈单谷。
如果 \(s\) 单谷那么说明谷低左侧的点向左无限运动,必然不合法。
因此我们要使得最终所有 \(s\) 相等,显然这个相等的值就是 \(\min_{i=1}^n s_i\),那么这些点能静止当且仅当 \(s_{\min}\ge x\)。
因此我们要计数有多少 \(x\) 使得所有 \(s_i\oplus x\ge x\),这只要 \(s_i\) 最高位不属于 \(x\) 即可。
求出所有 \(s_i\) 最高位的并,剩下的位可以随便选。
时间复杂度 \(\mathcal O(2^n)\)。
Submission Link
2. [ARC152F] Attraction on Tree
Problem Link
给定一个 \(n\) 个点的树,一个动点 \(x\) 初始在 \(1\),找到一个排列 \(p_1\sim p_n\),使得第 \(i\) 步满足 \(x\ne p_i\) 然后让 \(x\) 向 \(p_i\) 方向移动一条边,最终 \(x=n\),最小化过程中 \(x\) 经过的点数。
数据范围:\(n\le 2\times 10^5\)。
显然最终经过了 \(2k+\mathrm{dis}(1,n)\) 条边,因此 \(n\not\equiv\mathrm{dis}(1,n)\pmod 2\) 就不合法。
先考虑最小值,即只经过 \(\mathrm{path}(1,n)\) 的方案。
那么对于路径上第 \(i\) 个点 \(c_i\),设他在路径外的子树大小为 \(\mathrm{siz}(c_i)\)。
我们发现很多操作都要在折返中抵消,那么我们只要钦定链上哪些操作最终有用,剩下的操作形成若干跨子树的匹配,那么我们一定能构造一个合法的 \(p\)。
根据经典结论,那么我们要求剩下的操作中不存在绝对众数。
找到最大的 \(\mathrm{siz}(c_i)\),那么我们至多在他的子树里钦定 \(i\) 个没被抵消。
因此这种情况的充要条件就是 \(\mathrm{siz}(c_i)-i\le\dfrac{n-\mathrm{dis}(1,n)}2\),显然这样的 \(i\) 至多一个,因此我们能构造出一个合法的匹配。
否则找到不合法的这棵子树,枚举一个连通块 \(S\),记每个连通块内节点 \(u\) 在连通块外的子树大小为 \(\mathrm{siz}(u)\)。
那么我们依然要求 \(\mathrm{siz}(u)-i\le\dfrac{n-\mathrm{dis}(1,n)}2\),证明大致同上。
那么我们要在这个基础上保留尽可能少的节点是的所有 \(\mathrm{siz}(u)\) 不超过 \(k=\dfrac{n-\mathrm{dis}(1,n)}2+i\)。
注意到 \(\mathrm{siz}(c_i)\le n-\mathrm{dis}(1,n)\le 2k\),因此不合法的所有点构成一条链,对于每个点贪心地割掉若干个最大的子树即可。
时间复杂度 \(\mathcal O(n)\)。
Submission Link
3. [ABC273G] Row Column Sums 2
Problem Link
求有多少个 \(n\times n\) 正整数矩阵使得其第 \(i\) 行和是 \(r_i\),第 \(j\) 列和是 \(c_j\)。
数据范围:\(n\le 5000,r_i,c_j\le 2\)。
显然 \(\sum r_i\ne\sum c_j\) 无解,不妨记 \(m=\sum r_i=\sum c_j\)。
否则我们可以看成二分图,\(r_i=0\) 不建点,\(r_i=2\) 拆成两个点,右部 \(c_j\) 同理,两个点 \((i,j)\) 匹配表示 \(A_{i,j}\) 上 \(+1\)。
但是对于 \(r_i=2,c_j=1,c_k=1\) 此时 \(i_0\to j,i_1\to k\) 和 \(i_0\to k,i_1\to j\) 是同一种方案,因此假设 \(r_i,c_j\) 中分别有 \(x,y\) 个 \(2\),那么答案要除以 \(2^{x+y}\)。
但这并不完全对,假如 \(r_i=2,c_j=2\),且 \((i_0,i_1)\to(j_0,j_1)\),此时只是重复计算了两倍贡献但除以了 \(4\),因此对于这样的匹配要乘回一个 \(2\)。
因此我们枚举 \(i\) 表示有多少这样的 \(r_p=c_q=2\) 且互相匹配,对答案的贡献就是对应匹配数 \(\times 2^i\),那么我们要求剩余部分没有这样的匹配,可以容斥原理解决:
其中乘第二个 \(2^i\) 是这 \(i\) 对 \((p_0,p_1),(q_0,q_1)\) 中每对有两种匹配方式。
时间复杂度 \(\mathcal O(n^2)\)。
Submission Link
4. [ABC273Ex] Inv(0,1)ving Insert(1,0)n
Problem Link
给定 \(n\) 个分数 \(\dfrac{a_i}{b_i}\),记 \(f_{l,r}\) 表示 \(\dfrac{a_l}{b_l}\sim \dfrac{a_r}{b_r}\) 在 Stern-Brocot Tree 上的虚树大小,求 \(\sum_{1\le l\le r\le n}f_{l,r}\)。
数据范围:\(n\le 10^{5},a_i,b_i\le 10^9\)。
先考虑如何求 \(l=r\) 的情况,显然一个分数的深度可以很大,但是根据经典结论,这条路径上转向点至多 \(\mathcal O(\log V)\) 个。
因此对于当前树上区间 \((\dfrac{a_L}{b_L},\dfrac{a_R}{b_R})\),我们可以求出最大的 \(k\) 使得 \(\dfrac{a_i}{b_i}<\dfrac{ka_L+a_R}{kb_L+b_R}\) 或 \(\dfrac{a_i}{b_i}>\dfrac{a_L+ka_R}{b_L+kb_R}\),这是容易的。
那么对于这个问题,首先如果 \(\gcd(a_i,b_i)\ne 1\),那么该分数无法表示,因此 \(f_{l,r}>0\) 的区间不会包含这些点,那么我们可以把原序列分成若干段,每段分别解决。
我们可以对所有分数建虚树,对于虚树上的一条链,贡献次数只和链底子树内包含的分数下标集 \(X\) 有关,只要 \([l,r]\cap X\ne\varnothing\) 那么这条链上每个节点都对 \(f_{l,r}\) 有 \(+1\) 贡献,可以用启发式合并动态维护这些下标。
然后递归,维护一个分数集合 \(S\),如果 \(S\) 中所有元素都在 \(mid=\dfrac{a_L+a_R}{b_L+b_R}\) 的同一侧,那么根据刚才的做法求出 \(k\) 后直接转成子问题,否则二分出 \(S\) 中 \(<mid\) 和 \(>mid\) 的两个子集分别递归,然后在当前节点上启发式合并维护当前节点权值。
时间复杂度 \(\mathcal O(n\log V\log n)\)。
Submission Link
*5. [AGC058D] Yet Another ABC String
Problem Link
求有多少 \(a\) 个 \(\texttt A\),\(b\) 个 \(\texttt B\),\(c\) 个 \(\texttt C\) 构成的字符串使得不存在子串 \(\texttt{ABC},\texttt{BCA},\texttt{CAB}\)。
数据范围:\(a,b,c\le 10^6\)。
记 \(n=a+b+c\)。
考虑容斥,钦定若干个 \(i\) 使得 \(s[i,i+2]\) 不合法,但是此时可能会同时钦定到 \(i,i+1\) 从而导致两个不合法段拼起来了。
因此我们不妨枚举极长的被钦定不合法的段,先求容斥系数,设 \(p_i\) 表示段长为 \(i\) 时的容斥系数,那么考虑上一个被钦定的位置有 \(p_i=-p_{i-1}-p_{i-2}\)。
边界条件是 \(p_2=0,p_3=-1\),从而得到 \(p_{3k}=-1,p_{3k+1}=1,p_{3k+2}=0\)(\(k>0\))。
枚举每一段的长度,会发现此时的序列形如:若干个被钦定的 \(\texttt{ABC}\) 循环串和一些没限制的字符。
- 长度为 \(3k\) 的串相当于 \(k\) 个 \(\texttt{ABC}\),但有 \(3\) 种方法选颜色。
- 长度为 \(3k+1\) 的串相当于 \(k\) 个 \(\texttt{ABC}\) 和一个自由字符。
- 自由字符可以看成 \(k=0\) 的长度为 \(3k+1\) 的串。
因此设 \(f_{i,j}\) 表示当前字符串长度为 \(i\),钦定 \(j\) 个 \(\texttt{ABC}\) 循环串的容斥系数,有转移:
答案为 \(\sum \binom{n-3i}{a-i,b-i,c-i}f_{n,n-3i}\)。
考虑如何求 \(f\),用二元生成函数,设 \(F(x,y)=\sum f_{i,j}x^iy^j\),转移系数为 \(G(x,y)\),那么 \(F(x,y)=\sum_{k\ge 0} G^k=\dfrac{1}{1-G}\)。
其中 \(G(x,y)=\sum_{k\ge 0}x^{3k+1}y-3\sum_{k\ge 1} x^{3k}=\dfrac{xy-3x^3}{1-x^3}\),因此 \(F(x,y)=\dfrac{1-x^3}{1-xy+2x^3}\)。
我们只要求 \([x^uy^v]\dfrac{1}{1-xy+2x^3}\) 即可,即 \([x^uy^v]\sum_{i\ge 0}(xy-2x^3)^i\),那么最终对答案有贡献的项就是 \((xy)^v(-2x^3)^{(u-v)/3}\),直接计算二项式系数即可 \(\mathcal O(1)\) 计算。
最终答案需要 \(\mathcal O(n)\) 项系数,预处理组合数后直接计算即可。
时间复杂度 \(\mathcal O(n)\)。
Submission Link
6. [AGC058E] Nearer Permutation
Problem Link
对于两个长度为 \(n\) 的排列 \(p,q\),定义它们的距离 \(d(p,q)\) 为:
- 每次交换 \(p\) 中相邻两个元素,使得 \(p=q\) 的最小操作次数。
定义单位排列 \(I=(1,2,\cdots,n)\),定义 \(f(x)\) 为字典序最小的排列 \(z\) 满足 \(d(x,z)\le d(I,z)\)。例如当 \(n=3,x=(2,3,1)\) 时 \(f(x)=(2,1,3)\)。
给定排列 \(q\),判断是否存在排列 \(p\) 满足 \(f(p)=q\)。
数据范围:\(n\le 3\times 10^5\)。
以下过程排列下标均为均为 \(0\sim n-1\)。
先考虑一种求 \(f(p)\) 的算法:从 \(f(p)=p\) 出发,每次尝试令字典序最小进行贪心调整:
- 记 \(s=\mathrm{inv}(p)/2\)。
- 进行如下操作 \(n\) 次:求出 \(\min\{p_0,p_1,\dots,p_s\}=p_k\),把 \(p_k\) 插入答案序列 \(q\) 的末尾并删除,然后令 \(s\gets s-k\)。
这个过程相当于贪心,每次这样的操作肯定会选取一个前缀最小值,而移动该前缀最小值对 \(d(p,q)-d(I,q)\) 有 \(-2k\) 的贡献,因此 \(k\) 的上界就是 \(\mathrm{inv}(p)/2\)。
观察 \(q\) 序列,如果存在某个位置使得 \(q_k>q_{k+1}\)(没有说明 \(q=I\),显然 \(f(I)=I\))。
那么说明 \(q_{k+1}\) 在 \(p\) 排列中一定是等到 \(q_k\) 删掉后才进入可能被选范围内。
考虑删除 \(q_k\) 前的 \(p\) 序列,此时 \(p_{s+1}=q_{k+1}\),\(p_0=q_k\),并且插入 \(q_{k+1}\) 后 \(s=0\),因此 \(q_{k+2}\sim q_n\) 与剩余的 \(p\) 序列一致。
我们只需调整 \(p_0\sim p_{k-1}\) 使得操作 \(k\) 次后 \(p\) 满足如上性质即可。
先令 \(q=p\),然后依次考虑 \(q_{k+1},q_{k-1},q_{k-2},\dots,q_0\),每次把当前元素 \(q_i\) 向后移动 \(c\) 位满足 \(q_{i}\le q_{i+1}\sim q_{i+c}\),若 \(i=k+1\) 则需满足 \(q_k\le q_{i+1}\sim q_{i+c}\)。
我们希望删除 \(q_{k+1}\) 前其在 \(p\) 中的位置 \(x\) 与当前的 \(s\) 差 \(s-x=y\) 尽可能小。
那么把 \(q_i\) 向后移动会使得原序列逆序对数 \(+1\),删除时花费代价 \(+1\),最终使得 \(y\) 减小 \(0.5\)。
因此我们要让 \(\sum c_i=\mathrm{inv}(q)/\mathrm{inv}(q)-1\),贪心让每次 \(c_i\) 尽可能取最大即可。
时间复杂度 \(\mathcal O(n\log n)\)。
Submission Link
*7. [AGC058F] Authentic Tree DP
Problem Link
对于一棵 \(n\) 个点的树 \(T\),定义 \(f(T)\) 为:
- 若 \(n=1\) 则 \(f(T)=1\)。
- 否则对于所有 \(e\in T\),设 \(T_{e,1},T_{e,2}\) 为切掉这条边形成的两棵子树,那么 \(f(T)=\dfrac 1n\sum_e f(T_{e,1})\times f(T_{e,2})\)。
给定 \(T\),求 \(f(T)\bmod P\) 的值。
数据范围:\(n\le 5000\)。
看到这个模型,考虑编一个组合意义:在每条边中间插一个点,那么 \(f(T)\) 就是随机排列每个点的标号,使得新加入的点标号都大于其邻居的方案数。
那么 \(f(T)\) 的定义相当于枚举最大值所在的位置,但是我们会发现此时的分母为 \(\dfrac 1{2n-1}\),我们需要调整,不妨给加入的每个点下面挂 \(P-1\) 个点,那么在模意义下分母为 \(\dfrac 1n\)。
然后我们可以考虑容斥,把边大于其父亲的限制容斥,那么所有的限制都形如儿子小于父亲,所有事件都独立,只要维护每个点为根的连通块大小即可。
转移时类似树形背包,动态枚举每条边断不断即可。
时间复杂度 \(\mathcal O(n^2)\)。
Submission Link
8. [ARC153E] Deque Minimization
Problem Link
给定十进制串 \(X\),记 \(f(X)\) 表示按如下方式能得到的最小十进制串 \(Y\):
- 从高到低考虑 \(X\) 的每一位,分别加入 \(Y\) 的首部或尾部。
给定 \(Y\),求有多少 \(X\) 使得 \(f(X)=Y\)。
数据范围:\(|Y|\le 2\times 10^5\)。
考虑 \(f(X)\) 的计算过程:显然对于当前位,如果小于 \(Y\) 的首位就放到队头,如果大于 \(Y\) 的首尾就放到队尾,如果等于 \(Y\) 的首尾,由于放到队头的若干个数单调不降,因此放到队头也一定更优。
因此我们可以得到一个区间 dp:\(f_{l,r}=f_{l+1,r}\times [Y_l\le Y_{l+1}]+f_{l,r-1}\times[Y_r>Y_l]\)。
把整个转移写在网格图上(图源官方题解):
要求的就是从 \((i,i)\to (1,n)\) 的路径数量和,注意到很多位置与 \((1,n)\) 不连通。
首先我们发现,如果 \(Y[1,l]\) 不是单调递增的,那么 \((l,r)\) 与 \((1,n)\) 不连通。
因此我们要考虑的 \(l\) 一定是前缀递增的一个连续段,这些区域有一个很好的性质,就是所有向上走的转移(\(f_{l,r}\to f_{l-1,r}\))始终都是存在的,那么可以考虑倒着维护每一行,即 \(l\) 递减地维护 \(f_{l,*}\)。
暴力转移肯定不优,不妨尝试把这段递增前缀中值相同的缩起来,这样我们就只要处理 \(\mathcal O(|\Sigma|)\) 个连续段了。
对于相同的一段 \(Y_{[a,b]}\),观察网格图的形状:左侧是一个只能向上走的阶梯,那么 \(f_{a,a}\sim f_{a,b}=1\)。
然后右侧是若干连续向右的矩形转移,直到 \((b,n]\) 中第一个 \(x\) 使得 \(Y_x>Y_b\),那么 \([b,x)\) 这个范围内所有 \(f_{l,r}\to f_{l,r+1}\) 的转移都是存在的。
可以发现 \(f_{[a,b],[x,n]}\) 这个范围内的值无法被某个 \(f_{i,i}\) 转移到,也不需要考虑。
那么我们只要考虑 \(f_{b,[b,x)}\to f_{a,[b,x)}\) 的过程,容易发现这就是进行了 \(k=b-a+1\) 次前缀和操作。
根据插板法可以直接算出多次前缀和的转移系数:\(f_{b,i}\to f_{a,j}\) 的系数为 \(\binom{j-i+k-1}{k-1}\),因此直接卷积一遍就能快处理 \(k\) 阶前缀和。
时间复杂度 \(\mathcal O(|\Sigma|n\log n)\),其中 \(|\Sigma|=9\)。
Submission Link
9. [ARC153F] Tri-Colored Paths
Problem Link
给定一张 \(n\) 个点 \(m\) 条边的无向简单连通图,求有多少种给边染色 \(\{1,2,3\}\) 的方法,使得至少存在一条简单路径上有三种颜色。
数据范围:\(n,m\le 2\times 10^5\)。
注意到限制比较松,我们可以考虑染了三种颜色但没有这样路径的方案数。
先考虑树的情况,取某条极长路径 \(u\to v\),显然路径上只有两种颜色,不妨假设第三种颜色在树上某个点 \(w\) 子树内。
那么 \(u\to w\) 整个部分不能包括两种颜色,同理 \(w\to v\) 部分也只能有一种颜色。
因此我们还能证明这样的 \(w\) 至多一个。
方案数就是 \(\sum f(deg_u)\),其中 \(f(x)=3^x-2^x+3\)。
因此对于一棵树,合法的染色方案一定存在恰好一个节点,使得该节点每个子树内都染相同颜色。
然后考虑一般情况,先缩点,对每个点双联通分量内部讨论:
- 存在一个长度 \(\ge 4\) 的环,此时整个点双联通分量只能染同一颜色,否则必然存在一条路径从任意一个点出发经过两种颜色,此时这个点往外连第三种颜色即可(手玩可以得出结论)。
- 否则该点双连通分量中只有三元环,先假设每条边颜色各不相同:
- 手玩发现如果环上存在两个点 \(u,v\) ,以及环外两点 \(x,y\) 使得 \(x\to u,y\to v\) 存在(\(x\ne y\))那么这个环不能染 \(> 1\) 种颜色。
- 否则分类讨论:如果 \(u,v,w\) 都只和 \(\le 1\) 个环外点相连,那么此时三元环可以染三种颜色,然后环外边染该点在环上对边的颜色,恰有 \(6\) 种方案,这种情况只在 \(n=4,m\ge 5\) 时出现。
- 否则这个点双一定恰为三元环,且恰有一个点 \(u\) 向外连边(假设 \(n>3\)),手玩发现三元环必须染三种不同颜色,且环外所有边必须都染 \(u\) 对边颜色,也只有 \(6\) 种方案。
否则所有点双都同色,类似树的结论,可以在圆方树上恰取出一个圆点使得其每个子树染相同颜色。
答案还是 \(\sum f(deg_u)\),但 \(u\) 是圆方树上所有圆点。
时间复杂度 \(\mathcal O(n+m)\)。
Submission Link
10. [ARC154E] Reverse and Inversion
Problem Link
给定一个 \(1\sim n\) 的排列 \(p\),\(m\) 次操作,每次随机一对 \(1\le l\le r\le n\) 并翻转 \(p_l\sim p_r\)。
对于最终的每个排列 \(q_1\sim q_n\),计算 \(\sum_{i<j} [q_i>q_j](j-i)\)。
数据范围:\(n,m\le 2\times 10^5\)。
考虑计算每个 \(i\) 对答案贡献的系数,容易发现这就是:
因此答案就是 \(\sum i^2-i\times q_i\),第一部分很好统计,我们只需要对于每个 \(p_i\) 求出其最终所在位置的期望。
可以发现对于每个 \(i\),一次操作后使得 \(i\to j\) 的方案数与使得 \(i\to n-j+1\) 的方案数是相等的。
因此对于每个 \(i\),有 \(\left(1-\dfrac{i(n-i)}{n(n+1)/2}\right)^m\) 的概率留在原地,剩下的情况所在位置的期望是 \(\dfrac{n+1}2\)。
那么就可以快速计算每个 \(p_i\) 最终位置的期望。
时间复杂度 \(\mathcal O(n\log P)\)。
Submission Link
*11. [ARC154F] Dice Game
Problem Link
给定一个 \([1,n]\) 的随机变量,对于 \(i\in [1,m]\) 求随机出 \(1\sim n\) 每个数至少一次的随机次数的 \(i\) 次方的期望。
数据范围:\(n,m\le 2\times 10^5\)。
假设 \(F(z)\) 为对应的 PGF,即 \([z^k]F(z)\) 表示随机恰好 \(k\) 次后得到所有面的概率,那么考察 \(F(e^z)\) 得到:
因此 \(F(e^z)\) 就是答案的 EGF。
先考虑求 \(F(z)\),从朴素 dp 开始:设 \(f_{i,j}\) 表示随机 \(j\) 次后已经得到 \(i\) 个数的概率,那么:\(f_{i,j}=\dfrac inf_{i,j-1}+\dfrac{n-i+1}n f_{i-1,j-1}\),用 \(F_i(z)\) 表示 \(\sum z^jf_{i,j}\) 得到:
那么最终的 \(F(z)=\dfrac{z}nF_{n-1}(z)=\dfrac{z^n(n-1)!}{\prod^{n-1}_{i=1}(n-iz)}\),不妨设分母为 \(G(z)\),可以通过分治 NTT 算出。
由于 \(F(z)\) 为无穷级数,并不方便直接带入 \(F(e^z)\),那么我们可以把 \(e^z\) 带入右侧得到 \(F(e^z)=\dfrac{e^{zn}(n-1)!}{G(e^z)}\)。
而 \(G(z)\) 为 \(n-1\) 次多项式,求 \(G(e^z)\bmod {z^{m+1}}\) 可以这样推导:
其中 \(\mathrm{EGF}\) 算子表示把 \(i\) 次项系数除以 \(i!\)。
而这个函数也可以通过分治 NTT 维护通分后的分子分母。
最后多项式求逆除一下得到 \(G(e^z)\),再求逆除一下得到 \(F(e^z)\) 即可。
时间复杂度 \(\mathcal O(n\log^2n+m\log^2m)\)。
Submission Link
12. [ARC155D] Avoid Coprime Game
Problem Link
给定 \(a_1\sim a_n\) 和 \(x=0\),A 和 B 轮流选择 \(a_i\) 并令 \(x\gets\gcd(x,a_i)\),不能重复用 \(a_i\),谁把 \(x\) 变成 \(1\) 就输。
对于每个 \(a_i\),求出 A 第一步操作该数后谁会赢。
数据范围:\(n\le2 \times 10^5\)。
注意到 \(x\mid a_i\) 比较麻烦,否则如果每次 \(x\) 严格变小,我们可以简单 dp 求胜负态。
设 \(f_x\) 表示当前胜负状态,那么 \(f_x=\mathrm{OR}\{\overline{f_y}\mid\exists a_i:\gcd(a_i,x)=y\}\),容易证明这一步取的 \(a_i\) 不可能被取过。
判断是否存在 \(a_i\) 是简单的,先求每个 \(x\) 的倍数数量,然后从大到小枚举 \(y\mid x\),把 \(y\) 的因子中 \(a_i\) 作为倍数的数量出现次数减去 \(y\) 的倍数的数量。
但是我们现在可能可以不让 \(x\) 变小,即拖延时间。
我们发现一个人会拖延时间当且仅当 \(f_x=0\),那么两个人会拖延时间直到所有 \(x\) 倍数被选完。
那么我们需要记录 \(x\) 的倍数已经用了几个,进一步发现只关心 \(x\) 倍数被选择个数的奇偶性就行,显然选择 \(x\) 的倍数的数量和操作数量相等。
那么跟上面类似 dp 即可,最后处理拖延时间的情况。
时间复杂度 \(\mathcal O(n\log^2n)\)。
Submission Link
*13. [ARC155E] Split and Square
Problem Link
设 \(S\) 是由 \(n\) 个 \(m\) 位二进制数组成的集合,定义 \(f(S)\) 表示 \(\{i\oplus j\mid i,j\in S\}\)。
一次操作可以选定 \(T\subseteq S\),使得 \(S\gets f(T)\cup f(S\setminus T)\),求使得 \(S=\{0\}\) 的最小操作次数。
数据范围:\(n,m\le 300\)。
这种问题先考虑 \(S\) 的线性基 \(e_1\sim e_k\),设最终 \(e_1\sim e_s\in T,e_{s+1}\sim e_k\in S\setminus T\)。
那么我们知道 \(f(T)\) 包含 \(e_1\oplus e_2\sim e_1\oplus e_s\),并且他们之间线性无关(任取一个子集显然异或和不为 \(0\))。
那么 \(f(T)\) 线性基大小 \(\ge s-1\),同理 \(f(S\setminus T)\) 线性基大小 \(\ge k-s-1\),因此线性基大小每次至多 \(-2\)。
然后我们分析每次线性基大小减小的下界,假如我们只想让新的 \(S\) 线性基大小减一,这是简单的,把 \(S\) 里的数唯一表示成 \(e_1\sim e_k\) 的异或和,表示方式中包含 \(e_1\) 的全部放进 \(T\)。
那么容易证明 \(f(T)\cup f(S)\) 的张成空间维度 \(\le k-1\)(可以用 \(e_2\sim e_k\) 表示所有数)。
那么这样操作每次线性基大小至少 \(-1\)。
再进一步分析:注意到操作一次之后 \(0\in S\),且以后该性质一直成立,不妨假设在操作的时候 \(0,e_1\sim e_k\in T\),那么 \(f(T)\) 依然满足这个条件,那么 \(f(T)\) 的线性基大小 \(\ge k\).
那么第二次操作以及之后每次操作不可能令 \(f(T),f(S\setminus T)\) 的线性基大小同时 \(-1\),因此每一步都只可能令线性基大小 \(-1\)。
那么我们只要特殊处理第一次操作,我们又发现令 \(S\) 的每个数异或上 \(S_0\)(某个元素)显然不会影响 \(f(T),f(S\setminus T)\) 的值,那么这样我们就又转化成了 \(0\in S\) 的情况。
因此我们只要求出这个新集合的线性基大小即可,std::bitset
优化一下。
时间复杂度 \(\mathcal O\left(\dfrac{nm^2}\omega\right)\)。
Submission Link
14. [ARC156D] Xor Sum 5
Problem Link
\(n\) 个值 \(c_1\sim c_n\) 填入 \(a_1\sim a_k\),可以重复(相等的 \(c\) 算不同元素),求所有 \(\sum_{i=1}^k a_i\) 的异或和。
数据范围:\(n,c_i\le 1000,k\le 10^{12}\)。
首先根据 Lucas 定理 \(\binom nm\bmod 2=[m\subseteq n]\),那么假设我们知道 \(c_1\sim c_n\) 的出现次数 \(b_1\sim b_n\)。
那么对应的方案数 \(\binom{k}{b_1,\dots,b_n}\) 为奇数当且仅当 \(b_1\sim b_n\) 构成了 \(k\) 在二进制下的一个划分,即 \(\forall i\ne j,b_i\operatorname{AND}b_j=0\)。
那么我们只要知道每个 \(k\) 的二进制位被哪个 \(c_i\) 选了即可。
从低到高考虑每一个二进制位 \(d\),可以直接 \(dp_i\) 记录前面的位对当前的进位为 \(i\) 的方案数,如果 \(d\in k\) 则枚举 \(a_i\),加入 \(a_i\times 2^d\)。
注意 \(2\mid n\) 时如果 \(d\) 小于 \(k\) 的最高位,这些方案数始终是偶数,不能计算贡献(最高位有 \(n\) 中方案)。
显然进位数不超过 \(2V\),直接 dp 即可。
时间复杂度:\(\mathcal O(nV\log k)\)。
Submission Link
*15. [ARC156E] Non-Adjacent Matching
Problem Link
给定 \(n\) 个点 \(1\sim n\),定义一张图是好的需要满足:
- \((1,2),(2,3),\dots,(n,1)\) 之间没有边。
- 每个点度数 \(\le m\)。
- 所有点度数和 \(\le k\)。
求有多少 \(x_1\sim x_n\) 可以作为一张好图的度数序列。
数据范围:\(n,m\le 3000,k\le nm\)。
记 \(S=\sum_{i=1}^n x_i\),一组序列合法当且仅当:
- \(2\mid S,S\le k\)。
- \(\forall i\in [1,n]\) 满足 \(x_i+x_{i+1}\le S/2\)。
- \(\forall i\in[1,n]\) 满足 \(x_i\in[0,m]\)。
可以验证这就是合法的充要条件,构造每次取一个 \(x_i+x_{i+1}=S/2\) 的点和任意一个其他的点连起来即可。
然后考虑对这样的序列计数。
我们容斥枚举 \(x_i+x_{i+1}>S/2\) 的位置数,容易证明不满足的位置 \(\le 2\) 个。
先考虑没有钦定位置的情况,直接容斥得到方案数为:
对于 \(S\in[0,k]\),最后一个式子是若干组合数的前缀和,对上指标奇偶性分类即可。
然后考虑钦定一个位置的情况:
枚举这两个位置的和 \(t\),暴力枚举这两个位置的所有分配,那么剩余位置的和 \(<t\) 且 \(\le k-t\)。
dp 预处理求出 \(n-2\) 个 \([0,m]\) 中变量凑出 \(<t\) 的方案总和,容易发现 \(t\le 2m\),因此前缀和优化 dp,时间复杂度为 \(\mathcal O(nm)\)。
由于还要钦定具体位置,所以最后答案记得 \(\times n\)。
对于钦定两个位置的情况,容易发现这两个位置一定相邻。
设对应的三个元素分别为 \(x,t,y\),剩余部分的和为 \(s\),那么所有限制为:
可以对所有 \((x,y)\) 二维前缀和出数量,枚举 \(s,t\) 即可,对于剩下 \(n-3\) 个元素的方案同样用 dp 出来的结果即可。
这一部分的答案也要记得 \(\times n\)。
时间复杂度 \(\mathcal O(k+nm)\)。
Submission Link
16. [ARC156F] Make Same Set
Problem Link
给定 \(a_1\sim a_n,b_1\sim b_n,c_1\sim c_n\)。
对于每个 \(i\) 把 \(a_i/b_i\) 加入 \(S\),\(a_i/c_i\) 加入 \(T\),求最大的 \(|S|\) 使得 \(S=T\) 并输出方案。
数据范围:\(n\le 5000\)。
先考虑可以不加入 \(a_i/b_i\) 和 \(a_i/c_i\) 的情况,这相当于类似三分图匹配的模型,建网络流即可解决。
不妨猜测这个问题的答案就是最终问题的答案。
显然答案不可能更大,我们只要保证 \(|S\cap T|\) 不变,然后使得 \(S,T\) 对称差变成 \(0\)。
我们考虑调整法:
- 如果 \(a_i\in S,a_i\not\in T,b_i\in T\)(\(b_i\in S\) 也同理),直接令 \(b_i\) 加入 \(S\),显然 \(a_i\not\in S\cap T\),那么此时对称差变小,是一种合法的调整。
- 否则对于任意 \(a_i\not\in T\iff b_i\not\in T\),显然 \(c_i\in T\),此时令 \(a_i\) 同时加入 \(S,T\)。
- 如果 \(c_i\in S\),那么 \(S\cap T\) 不变,下一次操作可以调整掉 \(c_i\) 使得对称差变小。
- 否则 \(S\cap T\) 变大,对称差变小。
那么我们只要 \(\mathcal O(n)\) 次调整即可。
时间复杂度 \(\mathcal O(n^2)\)。
Submission Link
17. [ARC157E] XXYX Binary Tree
Problem Link
给你一棵二叉树(儿子数 \(0/2\)),你需要给每个点黑白染色,使得对于 \(n-1\) 条父亲到儿子的边中:
- 有 \(A\) 个黑 - 黑。
- 有 \(B\) 个黑 - 白。
- 有 \(C\) 个白 - 黑。
- 没有白 - 白。
数据范围:\(n\le 10^4\)。
首先所有白色都是独立集,因此有 \(B/B+1\) 个白点(根据根的颜色决定)。
并且每个白点对 \(C\) 的贡献都是 \(0\) 或 \(2\),因此有 \(\dfrac{C}2\) 个非叶节点。
因此我们要找一个独立集包含 \(B\) 个点和 \(B-\dfrac C2\) 个叶子,或者 \(B+1\) 个点和 \(B-\dfrac C2+1\) 个叶子。
那么我们可以 dp,设 \(f_{u,i}\) 表示 \(u\) 子树选 \(i\) 个叶子,独立集最大是多少,转移直接树形背包。
时间复杂度:\(\mathcal O(n^2)\)。
Submission Link
*18. [ARC157F] XY Ladder LCS
Problem Link
给定两个长度为 \(n\) 的 01 串 \(s,t\),你可以交换若干对 \((s_i,t_i)\),最大化 \(\mathrm{LCS}(s,t)\) 并输出之,如有多解输出字典序最小的一个。
数据范围:\(n\le 50\)。
首先对于每一对匹配的 \(s_i,t_j\),可以通过交换 \((s_i,t_i),(s_j,t_j)\), 使得所有 \(i>j\)。
那么我们有一个暴力的做法:维护 \(dp_{i,Q}\),表示考虑到了 \(s[1,i]\),设最后一次匹配是 \(s_j,t_k\),那么 \(t[k+1,i]=Q\)。
转移时枚举是否交换,是否匹配,如果把当前的 \(s_i\) 匹配了,那么就从 \(Q\) 的前面开始往后找,找到第一个 \(Q_p=s_i\),然后删掉 \(Q[1,p]\)。
这样复杂度是 \(\mathcal O(n2^n)\) 的,难以通过。
观察到答案看起来比较大,事实上可以通过暴力枚举证明对于连续的 \(3\) 个位置,无论他们怎么排序,都有一种操作方式使得他们的 \(\mathrm{LCS}\ge2\)。
因此答案 \(\ge 2\left\lfloor\dfrac n3\right\rfloor\),因此 \(|Q|\ge \left\lceil\dfrac n3\right\rceil\) 一定不是最优解,那么此时状态数就优化到了一个可以接受的范围。
根据题目的要求,我们要按长度为第一关键字,字典序为第二关键字比较信息,显然 可以在最高位前面加一个 \(1\) 作为符号位,那么符号位越高说明长度越大,为了求字典序最小值,把其他位 01 翻转即可,同理 \(Q\) 也能这么表示。
时间复杂度:\(\mathcal O(n2^{n/3})\)。
Submission Link
*19. [Hitachi20F] Preserve Diameter
Problem Link
给定一棵 \(n\) 个点的树 \(T\),求有多少种在树上加边的方式使得得到的新图 \(G\):
- 无重边自环。
- 直径长度不变。
- 对于任意一对未连接的点对,连边后图的直径都会变小。
求合法 \(G\) 的数量。
数据范围:\(n\le 2\times 10^5\)。
首先我们发现,如果 \(G\) 中直径不唯一,我们可以通过缩短某条直径的不重合部分保证答案不变,因此原图直径必须唯一。
考虑 \(G\) 中的直径 \(s,t\),建立以 \(s\) 为根的 BFS 树,那么这个图合法当且仅当没有与 \(t\) 同层的其他点,并且所有连接相邻层或同层的点都已被连接。
因此一组合法的 \(\mathrm{dis}(s,1)\sim \mathrm{dis}(s,n)\) 与一个 \(G\) 构成双射。
我们发现一组 \(dis\) 合法当且仅当 \(\forall (u,v)\in T:|dis_u-dis_v|\le 1\),因此暴力枚举每条边的权值,dp 时维护 \(u\) 子树内有没有深度为 \(dis_t-dis_u\) 的点即可,当然我们的限制是至少一个,因此还要记录值是 \(0/1/\ge 2\),转移时枚举 \(dis_u-dis_v\in\{-1,0,1\}\) 即可。
但我们这样解决问题还要枚举直径起点,比较好的想法是枚举直径中点,然后 dp 时维护子树内深度为的 \(dis_t-dis_u,dis_u-dis_t\) 两种点分别有多少,两侧分别取出恰好一个点作为直径端点。
对于直径长度为奇数的边,把这条边切掉形成两棵子树分别 dp 即可。
时间复杂度 \(\mathcal O(n)\)。
Submission Link
20. [ABC274Ex] XOR Sum of Arrays
Problem Link
给定 \(x_1\sim x_n\),\(q\) 次询问 \(x[a,b]\oplus x[c,d]\) 与 \(x[e,f]\) 的字典序大小关系(两个序列的异或定义为所有元素对位异或)。
数据范围:\(n\le 5\times 10^5,q\le 5\times 10^4,x_i\le 10^{18}\)。
显然只要求出最大的 \(k\) 使得 \(x[a,a+k-1]\oplus x[c,c+k-1]\oplus x[e,e+k-1]=0\) 即可。
那么我们自然考虑设计一个哈希函数维护这个过程,但普通的字符串哈希函数不支持异或,即 \((a_i\times B)\oplus (a_j\times B)\ne (a_i\oplus a_j)\times B\),即 \(\times\) 对 \(\oplus\) 没有分配律。
注意到异或又能看成二进制下不进位加法,且乘法对加法有分配律,那么我们要单独看这个二进制数的每一位,可以用向量来看待,因此我们可以设计矩阵来描述哈希函数信息。
记 \(k=\log_2V\),那么把所有 \(a_i\) 看成 \(k\) 维 01 向量,而 \(B\) 看成一个 \(k\times k\) 的 01 矩阵,在 \(\bmod\ 2\) 意义下做矩阵加乘,此时 \(\oplus\) 和 \(+\) 等价,故具有分配律。
而 \((\oplus,\mathrm{AND})\) 矩阵乘法可以用位运算优化到 \(\mathcal O(k^2)\),矩阵乘向量可以优化到 \(\mathcal O(k)\)。
而在构造出哈希函数后,我们可以用倍增解决原问题,直接维护所有 \(a[i,i+2^k-1]\) 的哈希值即可。
时间复杂度 \(\mathcal O(nK\log N)\)。
Submission Link