Atcoder 题目选做(一)


\(\text{By DaiRuiChen007}\)


1. [ARC080F] Prime Flip

Problem Link

数轴上有 \(n\) 个点 \(a_1\sim a_n\) 的颜色是黑色的,其余颜色为白色。

每次操作可以选连续 \(p\) 个位置反色,其中 \(p\) 必须是奇素数。

求全部位置染白的最小操作次数。

数据范围:\(n\le 100,a_i\le 10^7\)

考虑差分,变成 \(d_i,d_{i+p}\) 取反,然后观察某两个为 \(1\) 的位置:\(i,j\),考虑这两个数还原的代价:

  • \(|i-j|\) 为奇素数,则 \(1\) 次操作即可还原这两个数。
  • \(|i-j|\) 为偶数,则 \(2\) 次操作可以还原:\(|i-j|\ge 6\) 时根据哥德巴赫猜想拆成两个奇素数之和,否则拆成 \(5-3/7-3\)
  • \(|i-j|\) 为奇合数,则 \(3\) 次操作可以还原,因为你要把 \(|i-j|\) 表示成若干个奇素数的和或差,那么操作次数必定与 \(|i-j|\) 同奇偶,构造很 trivial。

可以证明答案一定是把这些 \(i,j\) 两两匹配。

先考虑只有后两种,那么同奇偶的点内部优先匹配,至多一组 \((i,j)\) 会用第三种方式还原。

然后考虑第一种操作,显然这种操作的点越多越好,注意到 \(i\bmod 2\ne j\bmod 2\),因此连边后求二分图最大匹配即可。

时间复杂度 \(\mathcal O(n^2\sqrt n+n^2\pi(\sqrt V))\)

Submission Link




2. [ABC251Ex] Fill Triangle

Problem Link

给定 \(a_{n,1}\sim a_{n,n}\),以 \(m\) 个值相同的区间的形式表示。

定义 \(a_{i,j}=a_{i+1,j}+a_{i+1,j+1}\),求 \(a_{k,1}\sim a_{k,k}\bmod 7\)

数据范围:\(n\le 10^9,m\le 200,k\le 5\times 10^5\)

先考虑 \(a_{n,j}\to a_{k,i}\) 的贡献系数,那就是 \(\binom{n-k}{j-i}\)

因此对于一个区间相等 \(a_{n,l}\sim a_{n,r}\),对单个 \(a_{k,i}\) 的贡献系数就是 \(\binom{n-k}{l-i}+\cdots+\binom{n-k}{r-i}\)

因此我们只要求组合数前缀和 \(\bmod 7\) 之后的结果。

可以用 Lucas 定理维护,设 \(\sum_{i=0}^y\binom nx=F(x,y)\),特殊处理最后 \(y\bmod n\) 项得到:

\[F(x,y)=F(x\bmod p,p-1)\times F(\lfloor x/p\rfloor,\lfloor y/p\rfloor-1)+\binom{\lfloor x/p\rfloor}{\lfloor y/p\rfloor}\times F(x\bmod p,y\mod p) \]

预处理 \(0\le x,y<p\) 的结果,能够做到 \(\mathcal O(\log _7n)\),为了优化常数,我们可以先求出 \(F(x,y)\bmod 7^4\) 的结果,由于 \(10^9<7^{12}\),那么这样只要递归 \(\le 3\) 层即可,可以近似看成 \(\mathcal O(1)\) 的。

时间复杂度 \(\mathcal O(mk)\)

Submission Link




3. [ARC087E] Prefix-free Game

Problem Link

定义一个 01 串集合 \(S\) 是好的:

  • 所有元素长度在 \([1,m]\) 之间。
  • 对于所有 \(s\in S\)\(s\) 的所有前缀不属于 \(S\)

给定初始值 \(S=S_0\),Alice 和 Bob 轮流往 \(S\) 中插入一个字符串,谁不能保持 \(S\) 是好的就输了,求赢家。

数据范围:\(L=\sum_{s\in S} |s|\le 10^5,m\le 10^{18}\)

先建立 Trie 树,那么 Trie 上的点和所有叶子的子树不能选。

那么剩下来的就是一些一度点的空子树,显然这些子树之间的博弈是互不影响的,求出每个子树的 SG 值后异或起来即可。

我们只要求 \(sg_n\) 表示深度为 \(n\) 的空 Trie 上的博弈的 SG 函数,枚举插入字符串深度得到:

\[sg_n=\mathrm{mex}\left\{\bigoplus_{k=n-i}^{n-1} sg_k\mid 1\le i\le n\right\} \]

打表发现 \(sg_n=\mathrm{lowbit}(n)\),可以归纳法证明,直接求值即可。

时间复杂度 \(\mathcal O(L)\)

Submission Link




4. [AGC006F] Blackout

Problem Link

给定 \(n\times n\) 网格,其中 \(m\) 个位置是黑色,按如下方式操作若干次:

  • \((a,b),(b,c)\) 是黑色,则令 \((c,a)\) 为黑色。

求最多的黑色网格数量。

数据范围:\(n,m\le 10^5\)

考虑把每个黑格子看成 \(a\to b\) 的边,然后玩一玩环的情况,容易发现有自环 \(u\to u\)\(u\) 对应的弱连通块最终一定会变成完全图。

继续观察:对于一个大小为 \(len\) 的环,选两对邻边操作,可以构造出一个大小为 \(len-2\) 的环,已知 \(len\in \{1,2\}\) 必能生成完全图。那么容易推知:对于任意 \(3\nmid len\),大小为 \(len\) 的环所在的弱连通块最后一定会变成完全图。

接下来考虑 \(3\mid len\) 的情况,对于同一个弱连通块容易想到三染色,把所有点染成 \(0/1/2\) 三种颜色,可以猜测最后的图中异色之间全部有边,同色之间全部没有额外边,可以通过归纳法考虑向某个颜色中加入一个新点证明。

注意特判整张图只能二染色的情况,对于每个连通块分别处理即可,注意每次要处理完整个弱连通块,因此考虑加入反向边。

时间复杂度 \(\mathcal O(n+m)\)

Submission Link




5. [ABC252Ex] K-th beautiful Necklace

Problem Link

给定 \(n\) 个球 \(m\) 种颜色,每个球有权值 \(v\),对于一种方案,选出每种颜色的球各一个,权值为选出球的权值异或和,求第 \(k\) 大的权值。

数据范围:\(n,m\le 70,k\le 10^{18},v\le 2^{60}\)

此时最大的方案数 \(K=3^{22}\times 4\approx 1.2\times 10^{11}\)

因此可以考虑 Meet-in-Middle,把所有颜色分成 \(L,R\) 两个集合,使得每个集合总方案数接近 \(\sqrt K\),可以证明误差不会太大。

那么我们可以爆搜得到每个颜色集合对应的权值集合。

然后把 \(L\) 中的数插入 01-Trie,统一维护 \(R\) 中每个数当前匹配到的位置,从高到低试填求出当前这一位为 \(1\) 时每个数匹配到的子树的大小之和,和 \(k\) 比较即可。

时间复杂度 \(\mathcal O(\sqrt K\log V)\)

Submission Link




*6. [ARC139F] Many Xor Optimization Problems

Problem Link

给定一个长度为 \(n\),值域为 \([0,2^m)\) 的序列,求所有子集的最大子集异或和的和。

数据范围:\(n,m\le 2\times 10^5\)

在介绍该问题做法前,我们先介绍一下二项式系数的拓展形式,q-binomial。

具体来说,q-binomial 依如下形式定义:

\[\begin{aligned} (n)_q&=\sum_{i=0}^{n-1} q^i=\dfrac{q^n-1}{q-1}\\ \binom nm_q&=\dfrac{\prod_{i=1}^n (i)_q}{\prod_{i=1}^m (i)_q\prod_{i=1}^{n-m}(i)_q} \end{aligned} \]

容易发现 \(q=1\) 就是正常的二项式系数,类比二项式系数的递推形式,q-binomial 也有如下的递推式:

\[\binom nm_q=q^m\binom{n-1}m_q+\binom {n-1}{m-1}_q=q^{n-m}\binom{n-1}{m-1}_q+\binom {n-1}m_q \]

证明方法是数学归纳法,然后展开观察系数。

这也为我们理解 q-binomial 的组合意义提供了一种方式:对于所有 \((0,0)\to (n-m,m)\) 的格路,求 \(q^{\mathrm{格路右下方点数和}}\) 的和。

根据组合意义,我们可以证明如下恒等式:

\[\sum_{i=m}^n q^{i-m}\binom im_q=\binom {n+1}{m+1}_q \]

除去暴力展开,该结论可以通过组合意义理解,先通过对称让 q-binomial 求所有格路 \(q\) 的左上方点数。

然后枚举 \((i-m,m)\to (i-m,m+1)\) 的时刻,而此时 \(m+1\) 行左上方的点数就是 \(q^{i-m}\),因此原结论得证。

然后回到原题上来,我们分步枚举,先枚举线性基大小 \(k\),以及自由元 \(a_1\sim a_k\)\(a_1\le a_2\le\dots\le a_k\))。

那么把原问题分三部分考虑,先求最大异或和的期望,显然自由元必须在其中,其他位在或不在概率均等。

因此这部分答案是 \(\dfrac 12(2^{a_k+1}-1+\sum_{i=1}^k 2^{a_i})\)

然后考虑 \(k\) 个自由元的填法,对矩阵进行转置,变成求 \(n\)\(2^k\) 向量线性无关:答案显然为 \(\prod_{i=0}^{m-1}(2^n-2^i)\)

对于剩余的数码,把每个向量写成高斯消元后的标准型,这个过程是一个双射。

容易发现只有 \(k\) 个向量非零,第 \(i\) 个向量剩余位任选的方案数为 \(2^{a_i-(i-1)}\)

因此我们得到:

\[\begin{aligned} \mathrm{Answer} &=\sum_{k=1,a_1\sim a_k}^{\min(n,m)}\prod_{i=0}^{k-1} (2^n-2^i)\dfrac 12\left(2^{a_k+1}-1+\sum_{i=0}^k 2^{a_i}\right)\prod_{i=1}^k 2^{a_i-(i-1)}\\[2ex] &=\dfrac 12\sum_{k=1,a_1\sim a_k}^{\min(n,m)}2^{-k(k-1)/2}\prod_{i=0}^{k-1} (2^n-2^i)\left(2^{a_k+1}-1+\sum_{i=0}^k 2^{a_i}\right)\prod_{i=1}^k 2^{a_i} \end{aligned} \]

把三个式子拆开分类讨论。

先计算第一部分 \(\prod_{i=1}^k 2^{a_i}\)

考虑格路计数的模型,对于 \(0\sim m-1\) 的每一位,是自由元看成向右走一步,非自由元看成向上走一步,那么我们能得到 \(\prod_{i=1}^k 2^{a_i-(i-1)}\) 的和,又因为该模型可以用 q-binomial 描述,因此得到:

\[\sum_{a_1\sim a_k}\prod_{i=1}^k 2^{a_i}=2^{k(k-1)/2}\binom mk_2 \]

然后计算第二部分 \(\left(\sum_{i=1}^k2^{a_i}\right)\prod_{i=1}^k 2^{a_i}\)

考虑容斥,先把求和号里的式子当成 \(2^m-1\),然后容斥掉选的那一位不属于 \(a_1\sim a_k\) 的贡献。

那么第二部分可以看成选 \(k+1\) 个元素的 \(2^{a_i}\) 之积,容易发现这个和式能用 \(\binom m{k+1}_2\) 表出。

但注意,对于 \(k+1\) 个元素,选出 \(k\) 个自由元的方案数为 \(k+1\) 种,因此得到:

\[\sum_{a_1\sim a_k}\left(\sum_{i=1}^k2^{a_i}\right)\prod_{i=1}^k 2^{a_i}=(2^m-1)2^{k(k-1)/2}\binom mk_2-(k+1)2^{k(k+1)/2}\binom m{k+1}_2 \]

最后计算第三部分 \(2^{a_k+1}\prod_{i=1}^k 2^{a_i}\)

枚举 \(a_k=i\),那么剩下的问题是一个 \(\binom i{k-1}_2\) 的子问题,配凑系数用刚才提到的 q-binomial 上指标求和公式处理:

\[\begin{aligned} \sum_{a_1\sim a_k} 2^{a_k+1}\prod_{i=1}^k 2^{a_i} &=2^{(k-1)(k-2)/2+1}\sum_{i=0}^{m-1} 2^{2i}\binom {i}{k-1}_2\\[2ex]\\ &=2^{(k-1)(k-2)/2+1}\times 2^{k-2}\left(\sum_{i=0}^{m-1} (2^{i+1}-1)2^{i-k+1}\binom i{k-1}_2+\sum_{i=0}^{m-1} 2^{i-k+1}\binom i{k-1}_2\right)\\[2ex] &=2^{k(k-1)/2}\left((2^{k}-1)\sum_{i=0}^{m-1}2^{i-k+1} \binom{i+1}k_2+\binom m{k}_2\right)\\[2ex] &=2^{k(k-1)/2}\left((2^{k}-1)\binom {m+1}{k+1}_2+\binom m{k}_2\right)\\[2ex] &=2^{k(k-1)/2}\left((2^{k}-1)\left(2^{m-k}\binom {m}{k}_2+\binom{m}{k+1}_2\right)+\binom m{k}_2\right)\\[2ex] &=2^{k(k-1)/2}\left((2^{m}-2^{m-k}+1)\binom mk_2+(2^{k}-1)\binom m{k+1}_2\right) \end{aligned} \]

最后把三个式子全部带入得到:

\[\begin{aligned} \mathrm{Answer} &=\dfrac 12\sum_{k=1,a_1\sim a_k}^{\min(n,m)}2^{-k(k-1)/2}\prod_{i=0}^{k-1} (2^n-2^i)\left(2^{a_k+1}-1+\sum_{i=0}^k 2^{a_i}\right)\prod_{i=1}^k 2^{a_i}\\[2ex] &=\dfrac 12\sum_{k=1,a_1\sim a_k}^{\min(n,m)}2^{-k(k-1)/2}\prod_{i=0}^{k-1} (2^n-2^i)2^{k(k-1)/2}\left((2^{m+1}-2^{m-k}-1)\binom mk_2-(k2^k+2^k-1)\binom m{k+1}_2\right)\\[2ex] &=\dfrac 12\sum_{k=1,a_1\sim a_k}^{\min(n,m)}\prod_{i=0}^{k-1} (2^n-2^i)\left((2^{m+1}-2^{m-k}-1)\binom mk_2-(k2^k+2^k-1)\binom m{k+1}_2\right)\\[2ex] \end{aligned} \]

最终按照式子计算即可。

时间复杂度 \(\mathcal O(n+m)\)

Submission Link




7. [ABC255G] Constrained Nim

Problem Link

给定 \(n\) 堆石子的 Nim 游戏,有 \(m\) 个限制表示:当前堆大小为 \(x\) 时不能取 \(y\) 个石子,求最终谁必胜。

数据范围:\(n,m\le 2\times 10^5\)

考虑算 SG 函数,我们需要特殊处理 \(\mathcal O(m)\) 个有特殊限制的点的 \(SG(x)\)

首先如果一个 \(x\) 没有限制,那么他的 SG 函数值就是 \(1+\max_{i\le x} SG(i)\),因此 \(SG\) 函数可以看成若干段斜率为 \(1\) 的一次函数,在所有有特殊限制的点处取值突变,因此对于突变点 \(x\) ,由 \(SG(x+1)\) 的值即可确定该段函数。

因此用 map 存每个突变点 \(x\)\(x+1\) 的 SG 函数值,二分即可得到任意 \(x\) 的 SG 函数值。

然后考虑突变点,我们要在 \(SG(1)\sim SG(x-1)\) 中找到所有 \(SG(x-y)\) 并删掉,统计每种删掉的函数值的出现个数,我们只要求某个 SG 函数值 \(w\) 的出现总次数。

观察一下函数图像可以发现,对于所有非突变点,他们的 SG 函数值单调递增(这是显然的),且中间不存在断点。

因此 \(w\) 一定在非突变点中出现恰好一次,而在突变点中的出现次数可以用 map 维护。

时间复杂度 \(\mathcal O(m\log m)\)

Submission Link




8. [ARC140F] ABS Permutation Count

Problem Link

给定 \(n,m\),对于所有 \(k=0\sim n-1\) 求恰有 \(k\)\(i\) 满足 \(|p_{i+1}-p_i|=m\) 的排列数量。

数据范围:\(n\le 2.5\times 10^5\)

先考虑 \(q=p^{-1}\),那么我们要求的就是恰有 \(k\)\(i\) 满足 \(|q_{i+m}-q_i|=1\)

先考虑 \(m=1\) 的情况,此时这个问题是经典的二项式反演,设 \(g_k\) 表示钦定 \(k\)\(i\) 满足条件的方案数,那么答案 \(f_k=\sum_{i\ge k}f_i(-1)^{i-k}\binom ik\),一次卷积即可。

\(g_k\) 又能看成原序列被分成 \(n-k\) 个值域连续 \(+1/-1\) 的段,对于长度 \(>1\) 的段有两种排列方式,最后再乘 \((n-k)!\) 排列值域相对顺序,用生成函数表示得到:

\[\begin{aligned} g_k &=(n-k)![z^n](z+2z^2+2z^3+\cdots)^{n-k}\\ &=(n-k)![z^k]\left(\dfrac{2x}{1-z}-z\right)^{n-k}\\ &=(n-k)![z^k]\left(\dfrac{2}{1-z}-1\right)^{n-k}\\ &=(n-k)!\sum_{i=0}^{n-k}(-1)^{n-k-i}2^i\binom{n-k}{i}[z^k]\dfrac{1}{(1-z)^i}\\ &=(n-k)!\sum_{i=0}^{n-k}(-1)^{n-k-i}2^i\binom{n-k}{i}\binom{k+i-1}{i-1} \end{aligned} \]

进行一次卷积即可,注意 \(g_0\) 要特殊处理。

对于一般的情况,递归处理 \(n=\lfloor n/m\rfloor\) 的生成函数为 \(g_1\)\(n=\lfloor n/m\rfloor+1\) 的生成函数为 \(g_2\)

那么最终的生成函数为 \(g_1^{m-n\bmod m}\times g_2^{n\bmod m}\),多项式快速幂计算,注意 \((n-k)!\) 要在最后乘,最后一次二项式反演即可。

时间复杂度 \(\mathcal O(n\log n)\)

Submission Link




9. [ARC141D] Non-divisible Set

Problem Link

给定 \(n\) 个数的集合,值域 \([1,2m]\),对于每个 \(a_i\) 求出是否存在一个大小为 \(m\) 的子集包含 \(a_i\) 且任意两个数不为倍数关系。

数据范围:\(m\le 3\times 10^5\)

注意到值域很小,因此考虑每个数的奇数部分,即把每个数拆成 \(k\times 2^d\) 其中 \(k\) 为奇数。

对于同一个 \(k\),显然至多选一个元素,又因为不同的 \(k\) 只有 \(m\) 个,因此每个 \(k\) 恰好贡献一个数。

对于 \(p\mid k\),那么 \(p\times 2^c\)\(k\times 2^d\) 同时选必须有 \(c>d\),那么对于每个 \(k\),其因数全部选尽可能大的 \(2^c\),倍数全部选尽可能小的 \(2^c\)

具体的构造直接让因数从小到到大贪心取,倍数从大到小贪心取即可。

因此对于每个 \(k\),合法的 \(d\) 是一个区间,且该区间可以快速求出,即 \(l_k\ge \max_{k\mid p}\{l_p+1\},r_k\le \max_{p\mid k}\{r_p-1\}\),找到区间内第一个和最后一个存在的 \(d\) 即可。

时间复杂度 \(\mathcal O(m\log m)\)

Submission Link




10. [ARC141E] Sliding Edge on Torus

Problem Link

给定 \(n\times n\) 个点,标号 \((1,1)\sim (n,n)\)\(q\) 次操作对于所有 \(((a+k)\bmod n,(b+k)\bmod n)\)\(((c+k)\bmod n,(d+k)\bmod n)\) 连边(\(0\le k<n\))。

每次操作后求图中连通块数。

数据范围:\(n,q\le 2\times 10^5\)

首先把 \((x,y)\)\((x,(y-x)\bmod n)\) 表示,那么相当于 \((i,(b-a)\bmod n)\)\(((i-a+c)\bmod n,(d-c)\bmod n)\) 连边。

对于 \((b-a)\bmod n\)\((d-c)\bmod n\),如果他们原先不在一个连通块里,那么连边相当于建立点之间的映射,如果此前他们已经联通,那么我们可以看成在 \((b-a)\bmod n\) 内部的连边,而边长(每条边跨越的长度)可以算出,那么每次连边后新的环数也可以维护(即所有边长的 \(\gcd\))。

因此用带权并查集维护当前列中的点到连通块的根中的点的映射,以及每个连通块内所有边长的 \(\gcd\) 即可,合并是简单的。

时间复杂度 \(\mathcal O(q\alpha(n))\)

Submission Link




*11. [ARC141F] Well-defined Abbreviation

Problem Link

给定字符串集合 \(S_1\sim S_n\),对于一个字符串 \(T\),每次可以删去 \(T\) 中的一个 \(S_i\) 子串直到不能操作,判定是否存在一个 \(T\) 使得最终停止时的 \(T\) 不唯一。

数据范围:\(L=\sum |S_i|\le 2\times 10^6\)

考虑什么时候 \(T\) 会产生两种不同的结果,手玩可以发现,当 \(T\) 包含子串 \(A+B+C\)\(A+B,B+C\in S\) 时就会导致 \(T\) 产生的结果不唯一。

当然前提条件是 \(A,C\) 不能同时被消成相等的。

进一步观察这个条件,我们发现需要对于 \(S_j\subseteq S_i\) 的情况进行处理,但由于本题较强的约束条件,此时的 \(S_i\) 无论以任何方式操作,都必须在空串处停止,否则 \(T=S_i\) 即是一组解。

因此我们可以考虑贪心,对 \(S_1\sim S_n\) 建 AC 自动机,逐位加入 \(S_i\) 的字符,如果当前串与某个 \(S_j\) 匹配,那么贪心地删去 \(S_j\),显然每次都会删掉一个后缀,因此用栈维护当前串每一位在 AC 自动机上的位置即可。

这个过程结束后得到的串如果非空那么原题有解,否则保留 \(S_i\) 当且仅当不存在其他 \(S_j\) 被当前串包含。注意特判存在 \(S_j\)\(S_i\) 后缀的情况。

此时任意两个字符串没有包含关系,然后我们只需判定有无这样的 \(A,B,C\) 即可。

然后对剩余的串建 AC 自动机,枚举 \(A+B\),跳 Fail 树得到所有可能的 \(B\),用哈希判断此时的 \(C\) 是否与 \(A\) 相等即可。

时间复杂度 \(\mathcal O(L|\Sigma|)\)

Submission Link




12. [ARC142D] Deterministic Placing

Problem Link

给定 \(n\) 个点的树,在树上放若干棋子:定义一次操作会把每个棋子移动到他的一个邻居上,使得每条边至多被经过一次,移动后每个点上至多一个棋子。

求有多少种初始放棋子的方法,使得可以该局面可以被操作任意次,且每次操作方案都唯一。

数据范围:\(n\le 2\times 10^5\)

手玩棋子移动的过程,先考虑树是链的情况,此时只有一个端点上没有棋子,然后其他棋子在这条链上往返运动。

然后考虑一般树的情况,容易发现一个合法局面依然能被分解成若干条链,并且链需要是有向的,设其指向空端点。

进一步的,对于一种合法的有向链剖分,链尾不能相邻,否则可以合成一条两端都是空节点的链,链头不能相邻,否则一次操作后就变成上面的情况,且链头或链尾不能和链中间节点相邻,否则中段节点可以跟另一条链尾。

那么可以设计 dp:\(f_{u,0\sim 7}\) 表示当前节点是链头,且有 / 没有链尾,当前节点是链尾,且有 / 没有链头,当前节点是链中间节点,且有 / 没有链头,有 / 没有链尾,转移时简单分类讨论即可。

时间复杂度 \(\mathcal O(n)\)

Submission Link




*13. [ARC142E] Pairing Wizards

Problem Link

题目大意

给定 \(a_1\sim a_n ,b_1\sim b_n\)\(m\) 组限制 \((x,y)\),确定 \(c_1\sim c_n\) 使得 \(c_x\ge b_x,c_y\ge b_y\)\(c_x\ge b_y,c_y\ge b_x\),最小化 \(\sum |c_i-a_i|\)

数据范围:\(n,V\le 100\)

思路分析

显然 \(c_i>a_i\),考虑网络流建模,用切糕模型处理:连接 \((i,j)\to T\) 权值为 \(1\)\((i,j)\to (i,j-1)\) 权值为 \(\infty\),表示 \(c_i\gets a_i+j\)

但是题目中的限制不好处理,设 \(b_x\ge b_y\),我们先初步调整令 \(a_x,a_y\ge b_y\),然后去除所有 \(\max(a_x,a_y)\ge b_x\) 的限制。

此时 \(a_x,a_y< b_x\),那么对于此时的 \(x\),要么 \(c_x\ge b_x\),要么所有的 \(c_y\ge b_x\),我们可以这样建模:连接 \(S\to x\) 权值为 \(b_x-a_x\),连接 \(x\to (y,b_x-a_y)\) 权值为 \(\infty\)

但这个模型有一点不完备:对于一个 \(x\),我们可能可能在 \(S\to x\)\((x,i)\to (x,i-1)\to\cdots\) 的链上分别割掉了一些边,此时这些代价就会被重复计算。

但我们发现这是不可能的,首先 \(S\to x\) 说明 \(a_x<b_x\),其次存在某条 \(z\to (x,i)\) 说明 \(b_z\ge b_x\) 且我们呢已经调整使得 \(a_z,a_x\ge b_x\) 从而导出矛盾。

因此这样的网络上的最小割就是答案。

时间复杂度 \(\mathcal O(\mathrm{MaxFlow}(nV,nV+m))\)

Submission Link




14. [ARC142F] Paired Wizards

Problem Link

有两个变量 \(x,y\) 以及 \(S=0\),他们可以分别执行两种操作之一:

  • 操作一:\(x\gets x+1\)\(y\gets y+1\)
  • 操作二:\(S\gets S+x\)\(S\gets S+y\)

接下来有 \(n\) 秒,每秒给定 \(a,b,c,d\in\{1,2\}\),你要在如下两种策略中选一项执行:

  • \(x\) 执行操作 \(a\)\(y\) 执行操作 \(b\)
  • \(x\) 执行操作 \(c\)\(y\) 执行操作 \(d\)

求最终 \(S\) 的最大值。

数据范围:\(n\le 8000\)

先转化代价计算:我们只考虑一个人所有操作二的时刻 \(t_1\sim t_m\),设 \(t_i\) 递增,那么总贡献就是 \(\sum t_i-i\)

设所有 \(t_i\) 的和为 \(w\)\(x\) 操作数 \(m_x\)\(y\) 操作数 \(m_y\),那么贡献就是 \(w-\dfrac{m_x(m_x+1)}2-\dfrac{m_y(m_y+1)}2\),因此我们只关心 \(w,m_x,m_y\)

考虑对所有操作分类讨论:

  • \((a,b)=(c,d)\):这种操作没有选择空间,直接统计入 \(w,m_x,m_y\)
  • \(a=c,b\ne d\):这种 \(x\) 没有选择空间,先计入 \(w,m_x\),然后枚举选择二操作的次数,即对 \(m_y\) 的贡献确定,此时我们只要最大化 \(w\),即选择时间最靠后一段操作。
  • \(a\ne c,b=d\):类似上面,先统计 \(w,m_y\),然后枚举 \(m_x\),选择操作的一段后缀。
  • \((a,b),(c,d)=(1,1),(2,2)\):此时同上,枚举选择 \((2,2)\) 的操作次数,同上,此时依然会选择一段后缀操作。
  • \((a,b),(c,d)=(1,2),(2,1)\):此时对 \(w\) 的贡献一定,我们只要枚举几个 \(m_x\) 几个 \(m_y\) 即可。

此时暴力枚举四类操作,复杂度 \(\mathcal O(n^4)\)

考虑分离过程:例如 \(a=c,b\ne d\) 的操作,他们的最优决策只和其他操作中 \(m_y\) 的贡献有关,因此我们可以设 \(f_i\) 表示 \(m_y=i\) 的最优代价,同理 \(a\ne c,b=d\) 的操作设 \(g_i\) 表示外界 \(m_x=i\) 的最小代价。

然后我们枚举最后两类操作的选择次数,那么我们可以直接得到外界 \(m_x,m_y\) 的数量,查询 \(f_{m_x}+g_{m_y}\) 即可得到此时第二、三类操作的最优贡献之和。

时间复杂度 \(\mathcal O(n^2)\)

由于代价函数满足四边形不等式,可以用分治或其他手段优化求值过程,或许可以做到 \(\mathcal O(n\log n)\)

Submission Link




15. AND OR Equation

Problem Link

题目大意

给定 \(n,k\),求有多少序列 \(a_{0}\sim a_{2^n-1}\) 满足值域 \([1,k]\) 且对于所有 \(i,j\) 都有:\(a_i+a_j=a_{i\operatorname{AND}j}+a_{i\operatorname{OR}j}\)

数据范围:\(n\le 3\times 10^5,k\le 10^{18}\)

思路分析

考虑逐位构造,考虑从 \(a_{0}\sim a_{2^d-1}\) 推出 \(a_0\sim a_{2^{d+1}-1}\)

对于 \(i,j<2^d\),我们知道 \(a_i+a_{j+d}=a_{i\operatorname{AND}j}+a_{(i\operatorname{OR}j)+d}=a_{i+d}+a_j\)

因此 \(a_{i+d}-a_{j+d}=a_i-a_j\),即 \(a_{2^d}\sim a_{2^{d+1}-1}\)\(a_{0}\sim a_{2^d-1}\) 是“相似”的,即差分相同。

那么可以考虑 dp,\(f_{d,x}\) 表示当前序列长度 \(2^d\),序列极差为 \(x\),考虑每次转移时值域的扩张量:\(f_{d+1,x+i}\gets f_{d,x}+(1+[i>0])\)

我们要从 \(f_{0,0}=1\) 出发,求出 \(\sum f_{n,i}(k-i+1)\),枚举 \(j\) 表示转移过程中恰好有 \(j\) 个时刻增加量 \(>0\),得到:

\[\mathrm{Answer}=\sum_{i=0}^k(k-i+1)\sum_{j=0}^{\min(n,i)}\binom nj2^j\binom{i-1}{j-1} \]

根据组合恒等式能得到答案为 \(\sum_{j=0}^n2^j\binom nj\binom{k+1}{j+1}\),维护 \((k+1)^{\underline{j+1}}\) 即可。

时间复杂度 \(\mathcal O(n)\)

Submission Link




16. [ARC144E] GCD of Path Weights

Problem Link

给定 \(n\) 个点 \(m\) 条边的 DAG,点有点权,有一些点权不确定,找到一种方式最大化所有 \(1\to n\) 路径点权和的 \(\gcd\)

数据范围:\(n\le 3\times 10^5\)

先删除所有不在 \(1\to n\) 路径上的点,然后拆点成边,使得答案变成路径边权和。

设答案为 \(p\),根据经典结论,存在一组序列 \(d_1\sim d_n\) 使得 \(\forall (u,v)\in E,d_u+w(u,v)\equiv d_v\pmod p\)

把图看成无向图,只要处理所有环的 \(\gcd\) 即可。

用可持久化并查集维护 \(d_{rt}-d_u\) 的值,遇到环时把答案和 \(d_u+w(u,v)-d_v\)\(\gcd\) 即可。

时间复杂度 \(\mathcal O((n+m)\alpha(n))\)

Submission Link




*17. [AGC008F] Black Radius

Problem Link

给定一棵 \(n\) 个点的数,\(f(u,d)\) 定义为距离 \(u\) 不超过 \(d\) 的点构成的集合,给定一个集合 \(S\subseteq V\),求对于所有 \(u\in S\) 共有多少本质不同的 \(f(u,d)\)

数据范围:\(n\le 2\times 10^5\)

首先考虑 \(S=V\) 的情况,容易发现 \(f(u,d)\) 容易产生重复,因此考虑最小表示法计数,对于每个 \(\ne V\)\(f(u,d)\),一定有一个 \(u\) 能最小化 \(d\),那么我们在这个 \(u\) 处记录 \(d\) 即可。

\(u\) 为根考虑,首先 \(f(u,d)<V\),因此 \(d<fi_u\),其中 \(fi_u\) 表示 \(u\) 所有儿子中的最大深度,然后考虑最小化 \(d\) 的限制,如果存在一个 \(u\) 的儿子 \(v\) 满足 \(f(v,d-1)=f(u,d)\) 则此时 \(d\) 不合法。

此时删掉 \(v\) 子树,不存在和 \(u\) 距离 \(d-1/d\) 的点,考虑取删除 \(fi_u\) 对应子树,显然找次大深度子树,记为 \(se_u\),那么 \(d-1\le se_u\),可以证明 \(d<\min(fi_u,se_u+2)\) 是充分的。

然后考虑 \(S\ne V\) 的情况,对于一个 \(u\not\in S\),依然考虑以 \(u\) 为最小表示的点集,且这个点集能被另一个 \(S\) 中的点 \(v\) 表示,显然要求 \(v\) 对应的子树全部属于 \(f(u,d)\),求出这些 \(v\) 对应子树里深度最小的一个,记为 \(lo_u\)\(u\) 的贡献就是 \(\min(fi_u,se_u+2)-lo_u\)

换根 dp 维护即可,记得最后加上全集。

时间复杂度 \(\mathcal O(n)\)

Submission Link




*18. [ABC257Ex] Dice Sum 2

Problem Link

给定 \(n\) 个骰子,第 \(i\) 个骰子代价为 \(w_i\),以均等概率得到 \(a_{i,1}\sim a_{i,6}\),你可以购买 \(m\) 个骰子,获得的权值是这些骰子显示面的数字之和的平方,求最大期望收益。

数据范围:\(n\le 1000\)

先考虑如何刻画选择 \(n\) 个骰子后的期望收益,可以建立 PGF,\(F_i(z)=\dfrac 16\sum_{x=1}^6z^{a_{i,x}}\),那么整体的 PGF \(F(z)=\prod _{i=1}^n F_i(z)\)

根据经典结论,平方的期望相当于 \(\sum i^2[z^i]F(z)\),即 \((zF'(z))'\)\(z=1\) 处的值。

展开得到:

\[\begin{aligned} (zF'(z))' &=zF''(z)+F'(z)\\ &=z\left(\sum_{i\ne j} F'_i(z)F'_j(z)\prod_{k\ne i,k\ne j} F_k(z)+\sum_{i=1}^n F''_i(z)\prod_{j\ne i} F_{j}(z)\right)+\sum_{i=1}^n F'_i(z)\prod_{j\ne i} F_{j}(z) \end{aligned} \]

\(F_i(1)=1\)\(F'_i(1)=\sum a_{i,x}\),记为 \(C_i\)\(F''_i(1)=\sum a_{i,x}^2\),记为 \(D_i\),带入得到答案为:

\[\sum_{i\ne j}C_i+\sum_i D_i^2+C_i=\left(\sum C_i\right)^2+\sum (D_i^2+C_i-C_i^2) \]

\(x_i=C_i,y_i=D_i^2+C_i-C_i^2-w_i\),那么问题就转化为选择若干 \(k_1\sim k_m\) 最小化 \((\sum x_i)^2+\sum y_i\)

枚举 \(k=\sum x_i\),此时我们把所有数按 \(kx_i+y_i\) 排序从大到小取 \(m\) 个即可。

进一步,我们不需要使得 \(\sum x_i=k\),只要对于每个 \(k\) 都算出一种最优解即可。

即对于所有大小为 \(m\) 的子集,我们只考虑那些存在某个 \(k\) 使得子集中的元素的 \(kx_i+y_i\) 排序后恰好是全体元素中前 \(m\) 大的那些子集。

此时枚举量为 \(\mathcal O(V)\),进一步优化,我们只要考虑哪些 \(k\) 会使得 \(kx_i+y_i\)\(kx_j+y_j\) 的大小关系发生改变。

因此令 \(k\) 从小到大取遍所有 \(\dfrac{y_i-y_j}{x_j-x_i}\),动态维护前 \(m\) 个值的和即可。

时间复杂度:\(\mathcal O(n^2\log n)\)

Submission Link




19. [AGC017E] Jigsaw

Problem Link

给定 \(n\) 个积木,每个积木中间高为 \(h\),左右两边离地 \(c_i,d_i\),积木块高度为 \(a_i,b_i\),求能否把这些积木拼在一起使得没有积木块悬空。

数据范围:\(n\le 10^5,h\le 200\)

考虑对每个积木设定特征值,其左特征值在 \(c_i=0\) 时设为 \(a_i\),否则是 \(-c_i\),右边同理。记该积木特征值为 \((l_i,r_i)\)

容易发现 \(i,j\) 能拼在一起当且仅当 \(r_i+l_j=0\),考虑对所有 \(l_i\) 取反,这样 \(r_i=l_j\) 才能拼在一起,把每个点看成一个 \(l_i\to r_i\) 的边,容易发现原问题等价于把所有边分解成链。

需要注意一个特殊情况就是 \(i,j\) 相邻,且 \(d_i=0,c_j=0\),此时相当于是两条链,因此我们只要找一种把所有边分解成任意多的链的方案,观察发现每个链必须从负权点出发到正权点,因此若记 \(\mathrm{deg}(u)=\mathrm{indeg}(u)-\mathrm{outdeg}(u)\),则每个负权点必须满足 \(\mathrm{deg}(u)\le 0\),正权点必须满足 \(\mathrm{deg}(u)\ge0\)

对于同一弱联通块中的点,满足 \(\mathrm{deg}(u)<0,\mathrm{deg}(u)>0\) 的点至少各一个,可以证明以上两个条件是充分的,证明如下:

考虑选一个 \(u\),满足 \(\mathrm{deg}(u)<0\),考虑一条边 \((u,v)\),若 \(\mathrm{deg}(v)\le0\),显然 \(\mathrm{outdeg}(v)\ge 1\),找到出边继续访问,直到找到一个 \(\mathrm{deg}(v)>0\) 的点结束。

考虑 \(u\to v\) 的路径,其中除 \(u,v\) 的点 \(\mathrm{deg}\) 都为 \(0\),删掉这条路径,显然会形成若干个连通块,且每个连通块至少有一个节点 \(w\)\(u\to v\) 上,若这个连通块没有 \(\mathrm{deg}(u)\ne 0\) 的点,则可以把这个连通块里的所有边连成一个 \(w\to w\) 的欧拉回路并到 \(u\to v\) 的路径上,否则数学归纳法可证这个连通块可以独立分解。

证毕。

注意特判没有出边入边的点,对每个弱联通块分别处理即可。

时间复杂度 \(\mathcal O(n+h)\)

Submission Link




*20. [ARC145E] Adjacent XOR

Problem Link

给定 \(a_1\sim a_n\),每次操作可以选定一个 \(k\),对于所有 \(i\in [2,k]\) 同时操作 \(a_i\gets a_{i-1}\oplus a_i\)

\(7\times 10^4\) 次操作内将 \(a_1\sim a_n\) 变成 \(b_1\sim b_n\)

数据范围:\(n\le 1000,V\le 2 ^{60}\)

反转操作过程,变成每次对 \(b_1\sim b_i\) 做异或前缀和。

那么合法的一个必要条件就是 \(a_i\oplus b_i\) 可以由 \(b_1\sim b_{i-1}\) 异或表出。

由于 \((i,n]\)\([1,i]\) 独立,因此我们可以逆序还原 \(b_n\sim b_1\)

对于单个 \(b_i\),我们可以把 \(a_i\)\(b_1\sim b_i\) 表出,求出线性基 \(c_1\sim c_k\),我们需要若干次操作调整使得 \(b_1\sim b_i\) 中每种基底的出现次数和在 \(a_i\) 中相等,最后一次操作 \(i\)

\(c_i=b_{p_i}\),那么 \(b_{1}\sim b_{p_i-1}\) 的表示中没有 \(c_i\),因此如果出现次数不等,我们操作 \(p_i+1\) 即可反转 \(c_i\) 出现次数。

根据上面的假设,\(a_i\oplus b_i\) 可以由 \(b_1\sim b_{i-1}\) 表出,因此贪心建立线性基,假设 \(b_i\) 是一组基底,即 \(b_i\) 不能被 \(b_{1}\sim b_{i-1}\) 表出,此时 \(a_i\) 不可能由 \(b_i\sim b_{i-1}\) 表出,否则可以通过表示 \(a_i,a_i\oplus b_i\) 得到 \(b_i\),产生矛盾。

因此顺序插入时,若 \(b_i\)\(b_1\sim b_i\) 中的一个基底,\(a_i\) 的表示方式中一定包含 \(b_i\),因此我们的调整操作不可能操作到 \(i+1\) 位上,从而证明了该判定是充分的。

逆序依次操作,每次建立线性基求解即可,操作次数 \(n\log V\)

时间复杂度 \(\mathcal O(n^2\log V)\)

Submission Link

posted @ 2024-05-17 21:02  DaiRuiChen007  阅读(8)  评论(0编辑  收藏  举报