Atcoder 题目选做(三)


\(\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\),那么我们要求剩余部分没有这样的匹配,可以容斥原理解决:

\[\mathrm{Ans}=\dfrac{1}{2^{x+y}}\sum_{i=0}^{\min(x,y)} 2^i\binom xi\binom yii!2^i\sum_{j=0}^{\min(x,y)-i}\binom{x-i}j\binom{y-i}jj!2^j(m-2i-2j)! \]

其中乘第二个 \(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}\) 循环串的容斥系数,有转移:

\[f_{i,j}=\sum_{k\ge 0} f_{i-3k-1,j-1}-3\sum_{k\ge 1}f_{i-3k,j} \]

答案为 \(\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\) 对答案贡献的系数,容易发现这就是:

\[\begin{aligned} \sum_{j<i}[q_j>q_i]-\sum_{i<j} [q_i>q_j] &=(i-1)-\sum_{j<i}[q_j<q_i]-\sum_{i<j} [q_i>q_j]\\ &=(i-1)-(q_i-1)=i-q_i \end{aligned} \]

因此答案就是 \(\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)\) 得到:

\[[z^i]F(e^z)=[z^i]\sum_{k=0}^{\infty} f_k\sum_{i=0}^\infty \dfrac{(kz)^i}{i!}=\sum_{k=0}^\infty \dfrac{k^if_k}{i!} \]

因此 \(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_i(z)=z\left(\dfrac in F_i(z)+\dfrac{n-i+1}n F_{i-1}(z)\right)=\dfrac{z(n-i+1)}{n-iz}F_{i-1}(z)=\dfrac{z^in^{\underline i}}{\prod_{j=1}^i(n-jz)} \]

那么最终的 \(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}}\) 可以这样推导:

\[G(e^z)=\sum_{i=0}^{n-1} g_i\sum_{j=0}^m\dfrac{(iz)^j}{j!}=\mathrm{EGF}\sum_{i=0}^{n-1}\dfrac{g_i}{1-iz} \]

其中 \(\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\) 个。

先考虑没有钦定位置的情况,直接容斥得到方案数为:

\[\sum_{S=0}^k[2\mid S]\sum_{i=0}^n(-1)^i\binom ni\binom{S+n-1-(m+1)i}{n-1} \]

对于 \(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\),那么所有限制为:

\[\begin{cases} x+t<y+s\\ t+y<s+x\\ x+s+t+y\le k\\ 2\mid x+s+t+y \end{cases} \implies \begin{cases} |y-x|<t-s\\ y+x\le k-t-s\\ y+x\equiv t-s \pmod 2 \end{cases} \]

可以对所有 \((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\) 条父亲到儿子的边中:

  1. \(A\) 个黑 - 黑。
  2. \(B\) 个黑 - 白。
  3. \(C\) 个白 - 黑。
  4. 没有白 - 白。

数据范围:\(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

posted @ 2024-05-19 00:18  DaiRuiChen007  阅读(19)  评论(0编辑  收藏  举报