Atcoder 题目选做(五)


\(\text{By DaiRuiChen007}\)




1. [ARC159E] Difference Sum Query

Problem Link

给定 \(n,m\),定义 \(x\in[1,n]\) 的深度 \(f(x)\) 为:

  • 初始 \([l,r]=[1,n]\)
  • \(i\) 次操作求出 \(l,r\)\(a_{i\bmod m} : b_{i\bmod m}\) 的比例的中点 \(mid\)
  • 如果 \(x=mid\),那么 \(x\) 深度为 \(i\),否则递归 \([l,mid-1]\)\([mid+1,r]\)

\(q\) 次询问 \([l,r]\),求出 \(\sum_{i=l}^{r-1}|f(i+1)-f(i)|\)

数据范围:\(n\le 10^{15},m\le 100,q\le 10^{4},2\min(a_i,b_i)\ge\max(a_i,b_i)\)

注意到每次操作实际上是在树上二分,可以建出类似线段树的结构,由于 \(\dfrac{a_i}{b_i}\le 2\),那么每次区间缩小至少 \(\dfrac 13\),最大深度为 \(\mathcal O(\log_{1.5}n)\)

这棵树的中序遍历是 \(1\sim n\),因此所有 \(i,i+1\) 都有祖先后代关系。

那么答案所求就是 \(l\sim r\) 虚树上的边。并且每条边访问两次,但 \(l\to r\) 路径上的访问 \(1\) 次。

可以转化为 \(rt\to l\sim rt\to r\) 的链并大小乘以二,减去 \(l,r\) 的深度。

\([l,r]\) 链并大小类似线段树直接拆分子区间递归即可。

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

Submission Link




2. [ARC159F] Good Division

Problem Link

定义一个序列是好的当且仅当可以每次删去一对相邻不同的数把序列删空。

现在给定一个长度为 \(2n\) 的序列 \(a\),计数有多少序列划分方式使得每一段都是好的。

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

先考虑哪些序列是好的,手玩发现当且仅当一个序列没有绝对众数的时候是好的,证明如下:

有绝对众数的序列把非绝对众数全部用掉之后也一定剩下一些绝对众数,因此不能清空。

否则只有出现次数为序列一半的数可能变成绝对众数,如果这种数只有一个,那么随便删都行,有两个的话这个序列只有两种颜色,找一个交界处一种颜色删一个即可。

因此可以设计一个 dp:\(f_i=\sum_{j}[a_{2j+1}\sim a_{2i}\text{ is valid}] f_j\)

注意到绝对众数这个条件一般会用摩尔投票法维护,而摩尔投票信息容易合并,因此想到 CDQ 分治。

考虑 \([l,mid]\to [mid+1,r]\) 的贡献,显然 \([i,j]\) 的绝对众数(如果存在)一定是 \([i,mid]\)\([mid+1,j]\) 的绝对众数。

又因为绝对众数切换至少需要两倍的长度,因此 \([i,mid]\)\([mid+1,j]\) 中的本质不同绝对众数只有 \(\mathcal O(\log n)\) 个。

由于摩尔投票不好同时维护多种颜色的情况,那么我们可以枚举每个可能的绝对众数 \(x\),只要数 \(x\) 出现次数减去 \(\ne x\) 出现次数,即可。

\([i,j]\) 有绝对众数 \(x\) 当且仅当前后缀摩尔投票结果加起来 \(>0\),直接对前缀摩尔投票结果用桶存即可。

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

Submission Link




3. [ABC279Ex] Sum of Prod of Min

Problem Link

对于所有长度为 \(n\) 元素和为 \(m\) 的数列 \(\{a_i\}\)\(\prod_{i=1}^n\min(a_i,i)\) 之和 \(\bmod 200003\)

数据范围:\(m\in[n,2n],n\le 10^{12}\)

考虑第 \(k\) 个位置上的 OGF:

\[F_k(z)=z+2z^2+\cdots+ kz^k+kz^{k+1}+kz^{k+2}+\cdots=\dfrac{z(1-z^k)}{(1-z)^2} \]

那么答案就是:

\[[z^m]\prod F_k(z)=[z^m]\dfrac{z^{n}}{(1-z)^{2n}}\prod_{k=1}^n(1-z^k)=[z^{m-n}]\dfrac{\prod_{k=1}^n(1-z^k)}{(1-z)^{2n}} \]

由于 \(m\le 2n\) 我们知道 \(m-n\le n\),因此我们可以把分子变成 \(\prod_{k=1}^{\infty}(1-z^k)\) 而不影响分子 \(\bmod z^{m-n+1}\)

然后就可以用欧拉五边形数公式变成 \(\sum_{k=-\infty}^{\infty}(-1)^kz^{k(3k-1)/2}\)

那么观察分母发现 \(z^k\) 系数就是 \(\binom{k+2n-1}{2n-1}\)

那么答案就是:

\[\sum_{k=-\infty}^{\infty}(-1)^k\binom{m-n-\dfrac{k(3k-1)}2+2n-1}{2n-1} \]

显然这个式子只有 \(\mathcal O(\sqrt n)\) 项,暴力用 Lucas 定理算即可。

时间复杂度 \(\mathcal O(\sqrt n\log_{P}n)\)

Submission Link




4. [ABC280Ex] Substring Sort

Problem Link

给定 \(n\) 个字符串,\(q\) 次询问所有字符串里的第 \(k\) 小串(位置不同算不同)。

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

考虑建立所有串的前缀树,字典序就是前缀树上的 dfs 序。

由于串数太多,考虑压缩前缀树,即所有反串构成的广义后缀自动机的 Parent-Tree。

答案就是这棵树上的 dfs 序,对于同一个节点,我们要求他的 \(\mathrm{Endpos}\) 总大小和长度区间就能知道到底对应多少个子串。

那么每个询问离线下来 dfs 双指针按顺序找到属于哪个节点对应的串,同理实际串长也可以简单算出。

那么我们只要比较 Parent-Tree 上 \(u\) 所有儿子的字典序大小,这是简单的,因为广义后缀自动机的性质,他的所有儿子的 lcp 必然是 \(\mathrm{len}(u)\),按该位排序即可。

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

Submission Link




5. [ABC281Ex] Alchemy

Problem Link

给定 \(X\)\(1\) 级宝石,对于一个 \(i\) 级宝石可以以如下方式合成:\(2\sim i-1\) 级的宝石各选 \(\le 1\) 个,\(1\) 级宝石选任意个不同种的,求能合成多少种 \(n\) 级宝石。

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

\(a_i\) 表示能合成的 \(i\) 级宝石的数量,容易得到 \(a_i=[z^i](1+z)^X\prod_{j=2}^{i-1}(1+a_jz)\)

考虑如何计算这个值:不妨设 \(F_i(z)=(1+z)^X\prod_{j=2}^{i-1}(1+a_jz)\),考虑分治 NTT,对于一个区间 \([l,r]\),我们从 $ F_l(z)$ 出发,然后求出 \(a_l\sim a_{mid}\),然后得到 \(F_{mid+1}(z)=F_l(z)\times\prod_{i=l}^{mid}(1+a_iz)\)

维护 \(\prod_{i=l}^{r}(1+a_iz)\) 作为该区间的返回值,每次合并左右区间答案的复杂度是 $\mathcal O(n\log^2n) $ 没有问题。

但是 \(F_l(z)\to F_{mid+1}(z)\) 的过程中可能由于 \(F_l(z)\) 次数过高导致复杂度过高。

但我们注意到 \(F_i(z)=F_l(z)\prod_{j=l}^{i-1}(1+a_jz)\),注意到后面一部分最多贡献 \(z^{i-l}\),因此前面至少要取 \(z^l\) 或更高次项作为系数。

同时 \(F_l(z)\) 不可能取次数 \(>z^r\) 的项的系数,因此我们只关心 \(F_l(z)\)\(z^l\sim z^r\) 的系数,那么这样递归复杂度就是正确的。

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

Submission Link




*6.[WTF22D] Welcome to Tokyo!

Problem Link

\(1\sim n\) 的数轴上有 \(m\) 个区间 \([l_i,r_i]\),对于 \(k=1\sim n\) 求出在数轴上选 \(k\) 个点至多有多少个区间与这些点有交。

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

看着题目的形式很像线性规划,考虑扩展到实数范围然后对偶:设 \(x_i\) 表示数轴上 \(i\) 被选了多少(实数次),对每个线段设 \(y_i=\min(1,\sum_{i=l}^r x_i)\),得到:

\[\begin{aligned} &\begin{cases} \forall i\in[1,m]: y_i\le 1\\ \forall i\in[1,m]: y_i-\sum_{j=l_i}^{r_i} x_j\le 0\\ \sum_{i=1}^n x_i\le k\\ \end{cases} \\ &\max\sum_{i=1}^m y_i \end{aligned} \]

可以证明这个线性规划的解一定在 \(x_i,y_i\in\{0,1\}\) 时取得。

设三个式子对应的对偶变量为 \(p_i,q_i,R\),那么对偶得到:

\[\begin{aligned} &\begin{cases} \forall i\in[1,n]:R-\sum_{l_j\le i\le r_j} q_j\ge 0 \\ \forall i\in[1,m]:p_i+q_i\ge 1 \end{cases}\\ &\min\sum_{i=1}^m p_i+kR \end{aligned} \]

注意到 \(R=\max_i\sum_{l_j\le i\le r_j}q_j,p_i=1-q_i\),那么不妨猜测 \(p_i,q_i\in\{0,1\}\),如果把 \(q_i=1\) 看成选了该线段的话,那么 \(R\) 就是这些线段覆盖次数最多的单点。

那么设线段集为 \(S\),对应的代价就是 \(m-|S|+k\times C(S)\),其中 \(C(S)\) 表示 \(S\) 这些线段覆盖次数最多的位置的覆盖位置。

那么枚举 \(x=C(S)\),求出 \(f_x\) 表示每个位置覆盖次数 \(\le x\) 时最多选多少线段,那么 \(ans_k=\min_x m-f_x+kx\),显然转移有决策单调性,可以双指针。

那么我们只要求出 \(f_1\sim f_n\)

考虑 \(f_{x-1}\to f_x\) 的过程,\(f_0\to f_1\) 有一个经典贪心就是每次选右端点最小的线段,容易证明这个策略在 \(x>1\) 时也适用。

那么用数据结构维护这个过程:先找到右端点最小的线段 \(q\) 并选择,然后找到最后一个覆盖次数达到 \(x\) 的位置 \(p\),显然后选的线段一定有 \(l_p>x\),否则一定有 \(r_p<x\le r_q\),那么第一步就会选 \([l_q,r_q]\),然后递归 \([p+1,n]\) 作为子问题即可。

我们需要 multiset 维护 \(l_i=t\) 的所有线段,每次删除一条求出 \(r_i\) 次小的一个。

线段树维护 \(l_i\) 在区间中,最小的 \(r_i\) 对应的线段,支持单点改(选线段)。

线段树维护区间 \(+1\),二分最后一个 \(\ge x\) 的位置。

这些都是经典操作,可以直接维护,比较方便的写法是把线段编号按 \(r\) 小到大重编,这样第一棵线段树只要维护标号即可。

容易发现每个线段至多删除一次,因此每个线段树的操作次数 \(\le m\)

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

Submission Link




7. [ABC283Ex] Popcount Sum

Problem Link

\(T\) 组询问给定 \(n,m,r\)\(\sum_{i=0}^{mi+r\le n} \mathrm{popcount}(mi+r)\)

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

显然考虑拆分每一位,对于 \(x\) 的第 \(k\) 位可以看成 \(\left\lfloor\dfrac x{2^k}\right\rfloor-2\left\lfloor\dfrac x{2^{k+1}}\right\rfloor\)

那么设 \(p=\left\lfloor\dfrac{n-m}{m}\right\rfloor\),得到:

\[\mathrm{Ans}=\sum_{k=0}^{30}\sum_{i=0}^p\left\lfloor\dfrac{mi+r}{2^k}\right\rfloor-2\left\lfloor\dfrac{mi+r}{2^{k+1}}\right\rfloor \]

显然可以看成 \(\mathcal O(\log V)\) 个求 \(f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\dfrac{ai+b}c\right\rfloor\) 的问题,类欧几里得算法解决即可。

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

Submission Link




8. [AGC062B] Split and Insert

Problem Link

给定一个排列 \(p_i=i\),第 \(i\) 次操作(\(1\le i\le m\))可以以 \(c_i\times k\) 的代价把末尾 \(k\) 个元素和前 \(n-k\) 个元素以任意顺序归并。

求把这个排列变成 \(a_1\sim a_n\) 的最小代价。

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

显然可以考虑时间倒流,变成把 \(a_1\sim a_n\) 中的 \(k\) 个元素放到末尾。

考虑最后一次操作(倒流前的第一次操作),显然序列中 \(1\sim n-k,n-k+1\sim n\) 的相对顺序必须被满足。

注意到这两个子问题是完全独立的,即只考虑这个排列 \(1\sim n-k\) 的部分,和 \(n-k+1\sim n\) 的部分,分别处理后每次把选择的子序列并起来即可,显然两部分相对顺序在最后一定分别被满足。

那么这就形成了子结构,\(dp_{i,l,r}\) 表示进行 \(i\sim m\) 次操作后,对值域 \(l\sim r\) 的元素排序的最小代价,转移为:

\[dp_{i,l,r}=\min_{x=l}^r\{dp_{i+1,l,x}+dp_{i+1,x+1,r}+c_i(r-x)\} \]

边界条件为初始满足的 \([l,r]\)\(dp_{m+1,l,r}=0\)

时间复杂度 \(\mathcal O(mn^3)\)

Submission Link




9. [AGC062D] Walk Around Neighborhood

Problem Link

给定 \(n\)\(a_1\sim a_n\),选择一个排列 \(p_1\sim p_n\),第 \(i\) 步恰好移动 \(a_{p_i}\)的曼哈顿距离。

找到一条从原点出发返回原点的路径,最小化路径到原点的最大曼哈顿距离。

数据访问:\(n,a_i\le 2\times 10^5\)

先对 \(a\) 升序排序,考虑什么时候无解,显然 \(\sum_{i=1}^{n-1}a_i<a_n\) 时必然无解,假如第一步走 \(a_n\),那么无论如何也回不去。

设答案为 \(d\),那么一步移动最多 \(2d\),因此 \(\dfrac{a_n}2\le d\le a_n\),显然最优解一定会经过边界,按这个过程分成两条原点到边界的路径。

由于 \(a_i\le a_n\le 2d\),那么只要找到这两条路径,剩余的步数可以直接在边界上移动掉。

根据调整法,一条路径可以走到边界上,那么这条路径能走到边界上的任意一个点。

那么我们找到一个 \(S\),一个 \(T\),使得 \(S\cap T=\varnothing\) 并且用这两个集合里的移动分别能走到边界上。

先进行所有 \(<d\) 的操作,如果这些距离的和 \(\ge d\),那么直接合法,否则我们考虑用一个 \(\ge d\) 的操作 \(a_k\),我们只要用 \(\le d\) 的操作走到 \(a_k-d\) 上即可。

显然两个 \(a_k\) 分别要取 \(\ge d\) 的最小值 \(x\) 和次小值 \(y\),不存在 \(y\) 则取 \(y=2d\)

然后我们要把 \(\le d\) 的元素分成两部分分别大于 \(x-d,y-d\),维护 \(<d\) 的数对应的背包,求出 \(\ge x-d\) 的最小子集,剩余的判断是否 \(\ge y-d\) 即可,这个过程可以 std::bitset 维护。

容易发现所求的子集和 \(<y-d+d\le a_n\),那么只要维护 \(\mathcal O(V)\) 个位置的背包。

时间复杂度 \(\mathcal O\left(\dfrac{nV}\omega\right)\)

Submission Link




*10. [AGC062E] Overlap Binary Tree

Problem Link

定义一个长度为 \(n\) 的二元组序列 \([(l_1,r_1),(l_2,r_2),\cdots,(l_n,r_n)]\) 是好的,当且仅当:

  • \((l_1,r_1,l_2,r_2,\cdots,l_n,r_n)\) 构成一个 \(1\sim 2n\) 的排列。
  • \(l_1<l_2<l_3<\cdots<l_n\)
  • \(\forall 1\le i\le n,l_i<r_i\)
  • 恰好存在 \(k\)\(i\) 满足 \(l_i+1=r_i\)
  • 存在一个有 \(n\) 个节点的有根树满足对于任意 \(i,j\)\(i,j\) 在树上有祖先-后代关系当且仅当区间 \([l_i,r_i],[l_j,r_j]\) 有交(可以是包含关系),并且该树满足每个节点有零个或两个儿子。

给定 \(n,k\),数有多少个好的二元组序列,对 \(998244353\) 取模。

先不考虑第四个限制,考虑把一个合法序列建成二叉树。

显然和所有区间都有交的区间只有一个,把这个区间提到根上,然后删掉。

那么剩下的 \(n-1\) 个区间可以分成值域不相交的恰好两部分,分别递归左右子树即可。

显然一个区间序列可以唯一对应一棵无标号二叉树,那么枚举一棵无标号二叉树尝试计算对应的合法序列数量。

自下往上确定每个区间,考虑 \(l_u\) 的取值,显然 \(l_u\le\min_{v\in\mathrm{subtree}(u)} r_v\)

我们考虑 \(l_u\) 在子树里的 \(2siz_u\) 个点里相对顺序,那么插入方案数为 \(1+\sum_{i\in\mathrm{subtree}(u)} [l_i\le \min r]\),显然 \(\min r\) 在从 \(u\) 出发不断向左走到的那个叶子上,而合法的 \(i\) 肯定就是这条不断向左走到的链上的节点。

\(i\) 向左走的链上有 \(d\) 个点,那么方案数为 \(d+1\)

从叶子上计数,设这个叶子向上最多走 \(d\) 条同向边,那么总方案数为 \((d+1)!\)

设叶子数 \(m=\dfrac {n+1}2\),那么我们可以把这 \(m\) 条链缩起来,即把 \(i\) 的父亲设为从第 \(i\) 个叶子所在的链顶所在的链。

最终会得到一棵有两个根的无标号树(根之间有顺序),这两个根就是原树根节点所在的两条同向链。

一个转化的例子如下图(来自官方题解):

可以发现一条链的长度在转化后就是一个点的度数。

\(m\) 个点标号,设第 \(i\) 个点的度数为 \(d_i\),那么贡献就是 \(\prod_{i=1}^{m}(d_i+1)!\)

然后考虑生成树的个数,每次选一条边,然后找一个没有父亲的点当儿子,方案数为 \(\prod_{i=1}^{m-2} (m-i)\times (m-i+1)\)

最后除去选边的顺序 \((m-2)!\),再区分两个根的顺序得到总方案数为 \(2(m-1)!\)

用生成函数描述答案:

\[\mathrm{Ans}=\dfrac{2(m-1)!}{m!}[z^{2m-2}]\left(\sum_{i=1}^{m-1}(i+1)!z^i\right)^m \]

现在考虑加入第四个限制,显然长度为 \(1\) 的区间肯定是叶子,如果走到底得到的点是一个长度为 \(1\) 的区间,那么 \(l_u\) 不能插入这两个点中间,方案数为 \(d\)

那么一个叶子被钦定长度为 \(1\),方案数会变成 \(d!\),钦定长度 \(>1\) 就会得到方案数为 \((d+1)!-d!\),得到:

\[\mathrm{Ans}=\dfrac{2(m-1)!}{m!}\binom mk[z^{2m-2}]\left(\sum_{i=1}^{m-1} i!z^i\right)^k\left(\sum_{i=1}^{m-1} ((i+1)!-i!)z^i\right)^{m-k} \]

用多项式快速幂解决,注意到两个多项式的 \(z^1\) 系数都为 \(1\),约去一个 \(z\) 即可方便处理。

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

Submission Link




11. [ABC289Ex] Trio

Problem Link

数轴上有三个动点初始在 \(a,b,c\),每秒随机移动到左邻居或右邻居,求 \(n\) 秒后三个人首次相遇的概率。

数据范围:\(n,a,b,c\le 10^5\)

先求方案数最后除以 \(8^n\)

考虑容斥,设 \(f_i\)\(i\) 秒后的答案,\(g_i\) 表示 \(i\) 秒后相遇(不要求首次的方案数),\(h_i\) 表示三个点从原点出发,\(i\) 秒后相遇的方案数。

那么我们知道 \(f_i=g_i-\sum_{j<i}f_jh_{i-j}\),设出生成函数 \(F,G,H\) 得到 \(F=G-F(H-1)\),得到 \(F=\dfrac{G}H\)

只要求出 \(G,H\),其中 \(H\) 只要令 \(a=b=c\) 再求一轮即可。

先平移使得 \(0=A\le B\le C\),容易得到:

\[g_i=\sum_x\binom{i}{\dfrac{i+x-a}2}\binom{i}{\dfrac{i+x-b}2}\binom{i}{\dfrac{i+x-c}2} \]

不妨假设 \(i=2k,a=2a',b=2b',c=2c'\) 得到:

\[\begin{aligned} g_{2k} &=\sum_x\binom{2k}{x+k-a'}\binom{2k}{x+k-b'}\binom{2k}{x+k-c'}\\ &=(2k)!^3\sum_x\dfrac 1{(x+k-a')!(x+k-b')!(x+k-c')!}\times \dfrac{1}{(a'+k-x)!(b'+k-x)!(c'+k-x)!} \end{aligned} \]

设两式分别和 \(x+k/x-k\) 有关,且和恰好为 \(2k\)

那么设 \(p_i=\dfrac{1}{(i-a')!(i-b')!(i-c')!},q_i=\dfrac 1{(i+a')!(i+b')!(i+c')!}\),则 \(G(z)\) 只要由 \(P(z)\times Q(z)\) 即可得到。

对于 \(i=2k+1\) 也能得到一样的结果,那么卷一次就得到结果。

最后多项式求逆除一下即可。

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

Submission Link




*12. [ABC290Ex] Bow Meow Optimization

Problem Link

给定 \(n\) 个 A 和 \(m\) 个 B,每个有权值 \(v_i\),定义一个排列中某个位置的系数 \(d_i\) 为他左右两侧另一种字符的出现次数之差。

重排整个序列,求最小的 \(\sum v_i\times d_i\)

数据范围:\(n,m\le 300\)

先考虑枚举一个 A,B 的排列,算最小代价。

首先对于排列中所有的 A,他们中的 \(d_i\) 是单峰函数,这是显然的,B 也是同理。

因此根据排序不等式排列所有 A 和 B 即可。

假设 \(n,m\) 都是偶数,那么前 \(\dfrac{n+m}2\) 个数中恰好有 \(\dfrac n2\) 个 A 和 \(\dfrac m2\) 个 B。

否则假设 A 数量较少,找到下一个 A,把他插到 \(\dfrac{n+m}2\) 上,显然这个 A 的系数在减少,并且这一段里的 B 的系数也在减小。

如果 \(2\nmid n\),那么显然最大的 \(a_i\) 在序列中间,同理 \(2\nmid m\) 也一样,我们只要考虑 \(2\mid n,m\) 的情况。

此时大胆猜测 \(\dfrac{n+m}2\) 左侧的所有 \(v_i\) 都是递增的,显然对于 A 和 B,他们同种字符内部的 \(v_i\) 满足这个关系。

否则如果 \(v_i>v_{i+1}\) 且两种字符不同,交换后代价减少 \(v_i-v_{i+1}\),证毕。

所以我们按权值从大到小考虑所有字符,并且讨论当前字符放在序列的最左边还是最右边即可。

\(f_{t,i,j}\) 表示考虑了权值最大的 \(t\) 个,其中 \(i\) 个 A 和 \(j\) 个 B 被放在 \(\dfrac{n+m}2\) 左边的最小代价。

转移时枚举每个 A/B 的决策转移即可。

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

Submission Link




13. [AGC063C] Add Mod Operations

Problem Link

给定 \(a_1\sim a_n\) 每次操作能选 \(x,y\) 令所有 \(a_i\gets (a_i+x)\bmod y\)\(n\) 次操作内使得 \(\{a_i\}\)变成 \(\{b_i\}\)

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

首先如果 \(a_i=a_j,b_i\ne b_j\) 就一定不行,然后我们就能去重 \(a_i\) 并升序排列。

手玩可以发现:令 \(y=a_n+x\),那么就能让 \(a_1\sim a_{n-1}\) 加上 \(x\),然后 \(a_n=0\)

逐步清空原本 \(a_i\) 的影响,设第 \(i\) 次操作取 \(x_i\),那么最后 \(a'_i=\sum_{j=n-i+2}^{n}x_j\)

那么 \(a’\) 递增,如果 \(b_1=0\)\(b\) 递增,直接取合适的 \(x_1\sim x_n\) 即可解决。

否则考虑取充分大值 \(A\),令 \(b'_i=b_i+iA\),那么再操作一次 \(x=b'_1,y=A\) 即可。

但是这样操作数 \(n+1\),还要再优化一下,注意到 \(x_1\) 没有什么用,那么 \(a'_1=a_1+\sum_{i=1}^{n-1}x_i\),取一个合适的 \(x_1=x'_1-a_1\),那么操作一次 \([x'_1,x'_1+a_2-a_1,\dots,x'_1+a_{n-1}-a_1,0]\),那么再来 \(n-2\) 次操作就能消掉所有 \(a_i\),此时 \(a'_2,a'_3,\dots,a'_n,a'_1\) 递增,类似处理即可。

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

Submission Link




*14. [AGC063E] Child to Parent

Problem Link

给定 \(n\) 个点的有根树,每个节点上有一个数 \(a_i\)

每次操作可以选定 \(a_u>0\) 然后 \(a_u\gets a_u-1,a_{fa(u)}\gets a_{fa(u)}+r\)

求有多少个不同的 \(\{a_i\}\) 可以被生成。

数据范围:\(n\le 300,a_i,r\le 10^9\)

首先合法操作必然可以调成从下到上,那么我们设 \(f_{u,i}\) 表示 \(u\) 子树向上进位 \(i\) 的答案。

那么每次 \(f'_{u,i+jr}\gets f_{u,i}\times f_{v,j}\),然后 \(f_u\) 做后缀和。

先考虑根节点上的 \(f\),用生成函数 \(f_u\) 刻画:那么我们要求的就是所有方案中 \(a_u+r\sum j_v\) 的值之和。

那么分拆下去我们要知道 \(\sum_j jf_{v,j}\),进一步要知道 \(\sum_j j^2f_{w,j}\),其中 \(fa(w)=v\)

\(F_{u,k}=\sum f_{u,i}i^k\),那么考虑转移:

\[\begin{aligned} F'_{u,k}&=\sum_if'_{u,i}i^k\\ &=\sum_i (i+jr)^k\sum_{j} f_{u,i}f_{v,j}\\ &=\sum_{i} \binom kp f_{u,i}i^p\sum_{j} f_{v,j}j^{k-p}r^{k-p}\\ &=\sum_i\binom kpr^{k-p}F_{u,p}F_{v,k-p} \end{aligned} \]

转移很简单,考虑每次做后缀和:

\[F'_{u,k}=\sum f_{u,i}(0^k+1^k+2^k+\cdots +i^k) \]

把自然数幂和看成一个关于 \(i\)\(k+1\) 次多项式,这个是经典的,就能从 \(F_{u,0\sim k+1}\)推出 \(F'_{u,k}\),显然 \(F_{u}\) 只要考虑 \(k\le dep_u\) 的答案。

再做后缀和前求出 \(F_{rt,0}\) 就是答案。

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

Submission Link




15. [ARC160D] Mahjong

Problem Link

定义一个序列是好的当且仅当:它可以通过给长度为 \(k\) 的区间 \(-1\) 和单点 \(-k\) 两种方法清零。

求长度为 \(n\),元素和为 \(m\) 的好序列有多少个。

数据范围:\(n,k\le 2000,m\le 10^{18}\)

考虑一个序列会对应多少清零序列,注意到两个清零序列本质相同只可能是把 \(k\) 个区间 \(-1\)\(k\) 个单点 \(-k\) 互相转化。

那么我们钦定区间 \(-1\) 操作数量 \(<k\),此时合法序列与清零序列一一对应,然后数合法的清零序列即可。

\(x_1\sim x_{n-k+1}\) 为每个区间被 \(-1\) 的数量,\(x_{n-k+2}\sim x_{2n-k+1}\) 表示每个位置被单点 \(-k\) 的数量。

那么 \(\sum x_i=\dfrac mk,x_1\sim x_{n-k+1}<k\),直接容斥,组合数暴力计算。

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

Submission Link




16. [ARC160E] Make Biconnected

Problem Link

给一棵 \(n\) 个点的二叉树,点有点权,加入一条边的代价时两端点点权和。

最小化加入边的代价和使得这张图变成点双连通图,给出构造。

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

显然所有叶子都必须连一条边,否则删掉他的父亲就不连通了。

假设这棵树有偶数个叶子 \(l_1\sim l_k\),我们可以把他们们两两匹配使得全图点双连通:

把叶子按 dfs 序排列,连接 \(l_i,l_{i+k/2}\)

显然删掉一个点之后整棵树最多分成 dfs 序上的三个区间。

若分成区间数 \(\le 2\) 时是简单的。

否则讨论 \(l_{k/2}\) 属于哪个区间,如果是第一个或第三个,那么这个区间和另外两个都连通。

如果在第二个区间,那么二三区间显然连通,并且第一个区间和 \(l_{k/2+1}\) 连通,那么三个区间连通。

否则我们考虑给一个叶子和树上某个点连接,其他点用上述方式构造。

对于一个叶子 \(x\),设他祖先里第一个三度点为 \(p\),那么 \(x\to p\) 的路径(包括 \(p\))以外都合法。

那么我们可以用类似换根 dp 的方式求出删掉每个点的代价,选最小值即可。

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

Submission Link




17. [ARC160F] Count Sorted Arrays

Problem Link

给定 \(n!\)\(n\) 个排列,\(q\) 次操作给定 \(u,v\),对于每个 \(p_u>p_v\) 的排列交换 \(p_u,p_v\),求出有多少排列被排好序,强制在线。

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

显然可以用经典的 01 序列的技巧,设 \(a_i=[p_i\ge x]\),那么暴力维护我们能知道每个 01 序列进行 \(q\) 此操作后会变成什么。

一个排列合法当且仅当分成的每个 01 序列最后操作完都是有序的。

考虑把一个排列看成从 \(00\dots 0\) 走到 \(11\dots 1\) 的路径,每次把一个 \(0\) 变成 \(1\),要求经过的 01 序列最后都被排序,那么这就是一个路径计数问题,简单 dp 即可。

但此时复杂度为 \(\mathcal O(q2^n)\),注意到有至少一处影响的非平凡操作数大概是 \(\mathcal O(n^2)\) 级别的,只有存在至少一个 \(p_u>p_v\)\((u,v)\) 操作才是有必要的。

每次加入非平凡操作时更新所有过 \(u/v\) 的操作的必要性状态即可。

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

Submission Link




18. [ARC161E] Not Dyed by Majority (Cubic Graph)

Problem Link

给定一张图,每个点度数为 \(3\),给每个点赋值 \(0/1\),定义一次变换是把每个点的权值同时变成其邻域权值的众数。

构造一个不可能是变换后结果的颜色序列。

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

考虑如何 检验 \(\{c_u\}\) 是否可以被 \(\{d_u\}\) 生成,显然可以用 2-SAT 解决。

\(c_u=0\)\(N(u)=\{x,y,z\}\),那么 \(d_x=1\implies d_y=0,d_z=0\),轮换后同理。

我们只要找到一个使得 2-SAT 无解的序列。

容易发现假如两个序列在变换后结果相同,那么就必定会产生一个序列不可生成。

考虑 \(1\) 的邻域 \(x,y,z\),以及他们的邻域 \(\{1,x_0,x_1\},\{1,y_0,y_1\},\{1,z_0,z_1\}\):如果 \(d_{x_0}=d_{x_1},d_{y_0}=d_{y_1},d_{z_0}=d_{z_1}\),那么无论 \(d_1\) 是什么,答案都不会更改。

因此我们说明至少有 \(\dfrac 1{16}\) 的序列会互相重复,那么期望 \(\mathcal O(1)\) 次随机后能得到一组解。

Submission Link




19. [ABC293Ex] Optimal Path Decomposition

Problem Link

\(n\) 个点的树进行树链剖分,每个链染一个颜色,最小化路径颜色数的最大值。

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

根据重链剖分的结论,答案不可能超过 \(2\log_2n\),然后可以二分答案 \(k\)

check 的时候设 \(f_{u,0/1/2}\) 表示当前和 \(u\) 颜色相同的儿子有至多 \(0/1/2\) 个,此时合法情况中最小的最大深度(深度指到 \(u\) 路径颜色数)。

对于一条边 \(u,v\)

  • \(f_{u,i}+f_{v,2}\le k\)\(f_{u,i}\gets \max(f_{u,i},f_{v,2}+1)\) 表示选不同颜色。
  • \(f_{u,i}+f_{v,1}-1\le k\)\(f_{u,i+1}\gets \max(f_{u,i},f_{v,1})\) 表示选同颜色。

直接转移即可。

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

Submission Link




20. [AGC064C] Erase and Divide Game

Problem Link

给定 \(S=\bigcup_{i=1}^n[l_i,r_i]\),两个人轮流操作,删去奇数或偶数,然后把剩下 \(S\) 中元素除以二下取整,删空的人获胜,问谁必胜。

数据访问:\(n\le 10^4,l_i,r_i\le 10^{18}\)

先考虑 \(l_i=r_i\) 的情况,那么相当于反串建 Trie 轮流向下移动,从下往上维护 dp 即可,\(f_u=\overline{f_{ls}}\operatorname{OR}\overline{f_{rs}}\)

那么现在面对的是若干区间,考虑自下而上地维护:先考虑最高位 \(k\),在 Trie 上就是最低一层,每次合并 \(i,i+2^{k-1}\),但是这里的合并可能是 \(f=0/1\) 或空节点。

注意到每次操作不用一个一个合并,可以把胜负态相同的一段区间一起合并:把所有区间分成 \([0,2^{k-1}),[2^{k-1},2^k)\),然后双指针把两部分的区间合并起来。

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

Submission Link

posted @ 2024-05-21 13:40  DaiRuiChen007  阅读(3)  评论(0编辑  收藏  举报