Atcoder 做题记录

AtCoder 做题记录

P.S. 带 * 的是我认为有一定难度的题,* 越多难度越大

ARC163

ARC163A

题意:给定长为 \(n\) 的字符串 \(s\),判断是否能将其划分为至少两段使得每段字典序严格上升

多测,\(1 \le T \le 2000\)\(1 \le \sum n \le 2000\)


\(s\) 可以划分为 \(\ge 3\) 段,可以将第 \(2, 3, \cdots\) 段拼在一起,仍然满足要求;因此只需判断将 \(s\) 划分为 两段 是否可行即可

枚举第二段起点暴力比较字典序是 \(O(n^2)\) 的,哈希 + 二分 lcp 可以优化到 \(O(n \log n)\)

ARC163B

题意:给定长为 \(n\) 的数列 \(a_i\),每次操作可任选一个 \(a_i (1 \le i \le n)\),令 \(a_i \leftarrow a_i+1\)\(a_i \leftarrow a_i-1\),给定 \(m\),求最少经过几次操作可以使得至少有 \(m\)\(a_i(3 \le i \le n)\) 满足 \(a_1 \le a_i \le a_2\)

\(3 \le n \le 2 \times 10^5\)\(1 \le m \le n-2\)\(1 \le a_i \le 10^9\)


容易发现让操作其他值找 \([a_1, a_2]\) 不如扩大 \([a_1, a_2]\) 去覆盖其他值更优,因此我们 只会操作 \(\bm{a_1, a_2}\)

\(a_3 \sim a_n\) 排序,每次找到连续的 \(m\) 个数 \(a_i \sim a_{i+m-1}\),用将 \(a_1\) 改到 \(a_i\)\(a_2\) 改到 \(a_{i+m-1}\) (如果需要改的话) 所需的操作次数更新答案即可

*ARC163C

题意:给定正整数 \(n\),你需要构造一个长为 \(n\) 的正整数序列 \(a_i\),满足:

  • \(\sum_{i=1}^{n} \frac{1}{a_i} = 1\)
  • \(a_i\) 互不相同
  • \(1 \le a_i \le 10^9\)

多测,\(1 \le T \le 500\)\(1 \le n \le 500\)


注意到 \(\frac{1}{n}-\frac{1}{n+1} = \frac{1}{n(n+1)}\),回忆小学奥数,我们考虑 裂项;有结论 \(\sum_{i=1}^{n-1} \frac{1}{n(n+1)} = 1-\frac{1}{2}+\frac{1}{2}-\frac{1}{3}+\cdots+\frac{1}{n-1}-\frac{1}{n} = 1-\frac{1}{n}\),后面再补上一项 \(\frac{1}{n}\) 就刚好满足题目的要求

不过若 \(\bm{n}\)\(\bm{k(k+1)}\) 的形式\(\frac{1}{k(k+1)}\) 就会出现两次,不满足要求;现在我们仍想利用上面的裂项结论,注意到 \(\bm{n-1}\) 必不能写作 \(\bm{k(k+1)}\) 的形式,于是考虑用 \(\frac{1}{n-1} + \sum_{i=1}^{n-2} \frac{1}{n(n+1)} = 1\);不过现在还缺一项,我们将整个式子全乘上系数 \(\frac{1}{2}\) 最后再补上 \(\frac{1}{2}\) 即可

***ARC163D

题意:给定一张 \(n\) 个点的竞赛图 \(G\),节点编号为 \(1, 2, \cdots, n\),且 \(G\) 满足:

  • 对于 \(G\) 中的所有边 \(u \rightarrow v\),恰有 \(m\) 条边满足 \(u < v\)

\(f(G)\) 表示图 \(G\) 中的强联通分量数量,求所有满足条件的 \(G\)\(f(G)\) 之和,答案对 998244353 取模

\(1 \le n \le 30\)\(0 \le m \le \frac{n(n-1)}{2}\)

若一个无重边、无自环的有向图 \(G\) 满足任意两点间恰有一条边,则称 \(G\) 为竞赛图


对于竞赛图,我们有结论:

  • 对竞赛图每个 SCC 缩点后,剩下的一定为由一条极长链与许多前向边组成的图

下面先证明这一结论

如果可证出必然存在极长链,则其余边必然是前向边,因为若其向回连就会成环

考虑归纳。显然 \(2\) 个点时结论成立,不妨设 \(i (i \ge 3)\) 个点时结论成立,极长链形如 \(a_1 \rightarrow a_2 \rightarrow \cdots \rightarrow a_i\),则若 \(i+1\) 个点时结论不成立:

  • 对于边 \((a_1, i+1)\),必然有 \(\bm{a_1 \rightarrow i+1}\),否则 \(i+1\) 可以作为新极长链的链首;同理,对于边 \((a_n, i+1)\),必然有 \(\bm{i+1 \rightarrow a_n}\),否则 \(i+1\) 可以作为新极长链的链尾
  • 对于边 \((a_2, i+1)\),应有 \(\bm{a_2 \rightarrow i+1}\),否则 \(a_1 \rightarrow i+1 \rightarrow a_2 \rightarrow a_3 \rightarrow \cdots \rightarrow a_n\) 可以成为新的极长链
  • 对于边 \((a_3, i+1)\),应有 \(\bm{a_3 \rightarrow i+1}\),否则 \(a_1 \rightarrow a_2 \rightarrow i+1 \rightarrow a_3 \rightarrow a_4 \rightarrow \cdots \rightarrow a_n\) 可以成为新的极长链
  • 类似地,我们可以证出对于任意 \(2 \le j \le i-1\),都有 \((a_j, i+1)\) 的方向是 \(\bm{a_j \rightarrow i+1}\)
  • 此时,你发现 \(a_1 \rightarrow a_2 \rightarrow \cdots \rightarrow a_{i-1} \rightarrow i+1 \rightarrow a_i\) 形成了新的极长链,矛盾!因此证毕

现在 SCC 的个数可以用极长链上边数 \(+1\) 表示;此时设极长链为 \(a_1 \rightarrow a_2 \rightarrow \cdots \rightarrow a_k\),则同理,SCC 个数可表示为在链上切一刀将整个链分为两集合 \(A = \{a_1, a_2, \cdots, a_i\}\)\(B = \{a_{i+1}, a_{i+2}, \cdots, a_k\}\) 的方法数 \(+1\)

考虑刻画 \(A\)\(B\) 的性质,由于在每个点只能向前走不能后退,显然有对于任意 \(u \in A, v \in B\),都有 \((u, v)\) 的方向为 \(u \rightarrow v\);那么这个结论是否充分呢?

事实上,我们有:

  • 求 SCC 的数量之和等价于求将竞赛图划分为 \(\bm{A, B}\) 两个集合,且对于任意 \(\bm{u \in A, v \in B}\),都有 \(\bm{(u, v)}\) 的方向为 \(\bm{u \rightarrow v}\) 的方法数

左推右上面证过了,下面证右推左

首先,必定不会存在一个 SCC 中的点一部分在 \(A\) 中、一部分在 \(B\) 中的情况,因为从 \(B\) 是走不回 \(A\) 的,这与 SCC 的定义相悖

又由于 \(a_i\) 可达任意 \(a_j (j > i)\),我们不会将前面的 SCC 划在 \(A\) 中后突然跳过一些 SCC 再将后面的 SCC 划入 \(A\) 中,因为此时跳过的那些 SCC 将被划入 \(B\),且其可达在其后面的、划入 \(A\) 中的 SCC,与上述集合 \(A, B\) 的性质相悖

综上,一种对 \(A, B\) 的划分方案必然形如 \(A = \{a_1, a_2, \cdots, a_i\}\)\(B = \{a_{i+1}, a_{i+2}, \cdots, a_k\}\),划分方案数就是 SCC 数量和,证毕

接下来直接 dp 即可

\(f_{i, j, k}\) 表示 \(i\) 个点的竞赛图,\(|A|=j\),形如 \(u \rightarrow v\)\(u < v\) 的边有 \(k\) 个时的划分方案数 (允许 \(A, B\) 为空集)

转移方程为:

  • \(f_{i, j, k} \rightarrow f_{i+1, j+1, k+l} \times C_{j}^{l}\),表示将点 \(i+1\) 划入 \(A\) 中,由于 \(B\) 中的点不会连向 \(A\) 中的点,只需考虑从 \(A\) 中选 \(l\) 个连向 \(i+1\) 带来的贡献
  • \(f_{i, j, k} \rightarrow f_{i+1, j, k+j+l} \times C_{i-j}^{l}\),表示将点 \(i+1\) 划入 \(B\) 中,\(A\) 中的 \(j\) 个点都向 \(i+1\) 连边带来了 \(j\) 的贡献,同时考虑从 \(B\) 中选 \(l\) 个连向 \(i+1\) 带来的贡献

初值显然为 \(f_{0, 0, 0} = 1\),统计答案时注意 \(f_{n, 0, m}\)\(f_{n, n, m}\) 本质相同,只需统计一次,因此为 \(\sum_{i=1}^{n} f_{n, i, m}\)

***ARC163E

题意:给定一长度为 \(n\) 的非负整数序列 \(a_1, a_2, \cdots, a_n\),Alice 和 Bob 轮流进行如下操作:

  • 选择一个非负整数 \(x\) 使得存在 \(i\) 满足 \(a_i > a_i \oplus x\)
  • 对于 \(1 \le i \le n\),令 \(a_i \leftarrow \min(a_i, a_i \oplus x)\)

规定最先无法操作的人失败;当两人都按照最优策略操作时,先手胜输出 Alice,后手胜输出 Bob

多测,\(1 \le T \le 100\)\(1 \le n \le 100\)\(0 \le a_i \le 10^9\)


考虑从简单情况入手

\(n=1\) 没什么讨论价值,先手直接将其变为 \(0\) 即可;对于 \(n=2\)\(0 \le a_1, a_2 \le 20\) 的情况,我们先打表找找规律,结果形如下图 (1 代表先手胜)

01111111111111111111
11001111111111111111
10101111111111111111
10011111111111111111
11111111011101111111
11111111110011001111
11111111101010101111
11111111100110011111
11110111111101111111
11111100111111001111
11111010111110101111
11111001111110011111
11110111011111111111
11111100110011111111
11111010101011111111
11111001100111111111
11111111111111111111
11111111111111111111
11111111111111111111
11111111111111111111

观察到这是一个递归的结构,具体的,将

0111
1100
1010
1001

视为新的 0,将

1111
1111
1111
1111

视为新的 1,则 \(16 \times 16\) 的情况与 \(4 \times 4\) 的情况相同

这启示我们从 \(4\) 进制的角度发掘结论:

  1. \(0 \le a_1, a_2 \le 3\),先手胜当且仅当 \(a_1 = 0, a_2 \ne 0\)\(a_1 \ne 0, a_2 = 0\)\(a_1 = a_2 \ne 0\)
  2. \(a_1, a_2 \ge 3\),将两数变为 \(4\) 进制表示,记 \(a_{1, i}\) 表示 \(a_1\) 在四进制下的第 \(i\) 位 (\(a_{2, i}\) 同理),则先手胜当且仅当存在 \(i\),使得 \(a_{1, i}\)\(a_{2, i}\) 满足情况一中的先手胜条件

P.S. 以下为叙述简洁,将上述情况称为 "必胜情况",非上述情况称为 "必败情况"

P.P.S 以下为叙述简洁,当 \(a_{1, i}\) / \(a_{2, i}\) 异或上 \(x\) 的第 \(i\) 位后导致结果必然比原数大时,我们称 \(a_{1, i}\) / \(a_{2, i}\) 是 "受限的"

考虑证明;则我们需要说明:

  1. 必胜情况下,对于先手一定存在某种操作方式使得操作后是必败情况
  2. 必败情况下,无论如何操作,操作后都是必胜情况

对于第一条,可以按如下方式构造:

  • 若第 \(i\) 位为必败情况,令 \(x\) 的第 \(i\) 位为 \(0\) (相当于使 \(a_{1, i}' = a_{1, i}\)\(a_{2, i}' = a_{2, i}\))
  • \(a_{1, i} = a_{2, i} \ne 0\),令 \(x\) 的第 \(i\) 位为 \(a_{1, i}\) (相当于使 \(a_{1, i}' = a_{2, i}' = 0\))
  • \(a_{1, i} > a_{2, i} = 0\) (\(a_{2, i} > a_{1, i} = 0\) 时同理):
    • \(a_{2, i}\) 是 "受限的",则令 \(x\) 的第 \(i\) 位为 \(a_{1, i}\) (相当于 \(a_{1, i}' = 0\),而 \(a_{2, i}'\) 受到原数不能变大的限制必然也是 \(0\))
    • 反之,任取 \(x\) 的第 \(i\) 位为不等于 \(a_{1, i}\) 且不等于 \(0\) 的数 (此时易证 \(a_{1, i}' \ne 0, a_{2, i}' \ne 0, a_{1, i}' \ne a_{2, i}'\))

对于第二条,考虑满足 \(a_{1, i} = 0, a_{2, i} = 0\) 不同时成立的最高位 \(i\),可以简单地分类讨论 (显然 \(x\) 的当前位为 \(0\) 对两数高位大小没有影响,且 \(x\) 不能一直为 \(0\),因此只考虑 \(x\) 当前位不为 \(0\) 的情况):

  • \(a_{1, i} = 1, a_{2, i} = 2\) (交换顺序同理),只能取 \(x\) 的对应位为 \(3\) (不然会异或出 \(0\)),但此时 \(1 \oplus 3 = 2 > 1\) 是 "受限的",最终 \(a_{1, i}' = a_{2, i}' = 1\),为必胜情况
  • \(a_{1, i} = 2, a_{2, i} = 3\),只能取 \(x\) 的第 \(i\) 位为 \(1\),此时 \(2 \oplus 1 = 3 > 2\) 是 "受限的",最终 \(a_{1, i}' = a_{2, i}' = 2\),为必胜情况
  • \(a_{1, i} = 1, a_{2, i} = 3\),只能取 \(x\) 的第 \(i\) 位为 \(2\),此时 \(1 \oplus 2 = 3 > 1\) 是 "受限的",最终 \(a_{1, i}' = a_{2, i}' = 1\),为必胜情况

综上,证毕

考虑对结论进行推广;按照类似的形式,我们猜测:

  • 对于 \(n > 2\) 的情况,先手必胜当且仅当能够找到 \(4\) 进制下一位 \(i\) 使得 \(a_{1, i}, a_{2, i}, \cdots, a_{n, i}\) 不全为 \(0\),且所有不为 \(0\) 的值相同

类似上面对 \(n=2\) 时结论的证明,对第二条简单画个表讨论下可证;其他部分的证明则没有使用 \(n=2\) 的限制,可以直接类比到 \(n>2\) 时的证明

***ARC163F

题意:对于序列 \(a\),定义 \(f(a)\) 为:

  • 每次操作可任选一个 \(i\) 使 \(a_i \leftarrow a_i-1\)\(a_i \leftarrow a_i+1\),使 \(a\) 单调不降的最小操作次数

给定 \(n, m\),对于 \(m^n\) 个长度为 \(n\),值域为 \([1, m]\) 的序列 \(a\),求所有 \(f(a)\) 的和,对 \(998244353\) 取模

\(1 \le n, m \le 10^5\)


已知 \(a\)\(f(a)\) 是一个经典的贪心问题,记答案为 \(ans\),解决方法如下:

  1. 维护可重集 \(S\),枚举 \(a_i\),向 \(S\) 中加入 \(a_i\)
  2. 记此时集合 \(S\) 中的最大值为 \(v\)
  • \(v \le a_i\),无事发生
  • 反之,令 \(ans \leftarrow ans+(v-a_i)\),删去 \(v\),加入 \(a_i\)

P.S 关于该做法的理解可以参考我 "贪心基础 - 学习笔记" blog 里面对该题的 题解

其实这里还有另一种理解方式,\(S\) 中的值对应原序列每个值最终要变成的值:

  • 每次先加入两个 \(a_i\),取出最大值 \(v\)
  • \(v \le a_i\),无需任何调整,直接把 \(v\) 删了即可
  • 反之,由于必然产生 \(v-a_i\) 的贡献,不妨将 \(S\) 中的 \(v\) 向下调整为 \(a_i\) 代表其最终需要变为 \(\bm{a_i}\)

最终答案为 \(\sum a_i - \sum S\)

显然 \(\sum a_i = n \times m^{n-1} \times \frac{m \times (m+1)}{2}\) (选一位,可填 \([1, m]\) 中任一数,其他 \(n-1\) 位随便填),我们只需求 \(\sum S\) 即可

直接考虑每个值的影响过于复杂;对于这种边加删值边维护信息的问题,考虑 拆贡献,转化为 \(\bm{01}\) 序列

枚举 \(x\),考虑统计 跨过值 \(\bm{x}\) 到达 \(\bm{x+1}\) 的值的个数;我们赋 \([1, x]\) 的值为 \(0\),赋 \([x+1, m]\) 的值为 \(1\),在这个 \(01\) 序列上跑原贪心问题,此时贡献为 \(S\)\(1\) 的个数

考虑维护依次往 \(S\) 中插数的过程,插入前有 \(k\)\(1\)

  • 插入 \([1, x]\) 中的数,即插入 \(0\),有 \(x\) 种方案,此时:
    • \(k = 0\)\(1\) 的个数变化为 \(0 \rightarrow 0\)
    • \(k > 0\),插入两个 \(0\) 扔掉一个 \(1\)\(1\) 的个数变化为 \(k \rightarrow k-1\)
  • 插入 \([x+1, m]\) 中的数,即插入 \(1\),有 \(m-x\) 种方案,此时插入两个 \(1\) 扔掉一个 \(1\)\(1\) 的个数变化为 \(k \rightarrow k+1\)

注意到这是 格路计数问题,考虑进行转化:

  • 将插入 \([1, x]\) 的数定义为 "向下走",即从 \((x, y) \rightarrow (x+1, y-1)\);特别的,若 \(y = 0\) 则从 \((x, 0) \rightarrow (x+1, 0)\)
  • 将插入 \([x+1, m]\) 的数定义为 "向上走",即从 \((x, y) \rightarrow (x+1, y+1)\)

注意到走到 \(y = 0\) 之后不能往下走的条件难以刻画,若在 \((x, 0)\) 处继续 "向下走" 到 \((x+1, 0)\),考虑在 \(x \in [0, x]\) 处都增加一个虚拟的 "1",即 \(\bm{[0, x]}\) 的路线整体抬高 \(\bm{1}\);每次遇到这种情况我们都抬高一次

容易发现,新路线与原路线一一对应,且 终点不变;于是我们需要统计从 \((0, *)\) 走到 \((n, *)\),且 必须碰到但不穿过 \(\bm{y=0}\) 的方案数 (\(*\) 代表不确定)

对于 "碰到但不穿过 \(y=0\)" 的限制,可以容斥掉,转化为 "不碰到 \(\bm{y=-1}\)" 的方案数减去 "不碰到 \(\bm{y=0}\)" 的方案数;这可以反射容斥求

反射容斥:
以从 \((0, p)\) 走到 \((n, q)\) 且不能碰到 \(y = 0\) 为例,考虑转化为总路径数减去不合法路径数

对于碰到 \(y = 0\) 的路径,将其从第一次碰到 \(y = 0\) 到终点的部分全部关于 \(y = 0\) 反射,终点由 \((0, q)\) 变为 \((0, -q)\),与原路径一一对应

不妨设 \(n\) 步中有 \(a\) 步向上走,\(b\) 步向下走,则有:
\(\displaystyle \begin{cases} a+b=n \\ a-b=q-p \end{cases} \implies \begin{cases} a = \frac{n+q-p}{2} \\ b = \frac{n+p-q}{2} \end{cases}\)

因此答案为 \(\displaystyle (C_{n}^{\frac{n+p-q}{2}} - C_{n}^{\frac{n+p+q}{2}}) \times x^{\frac{n+p-q}{2}} \times (m-x)^{\frac{n+q-p}{2}}\)

因此,从 \((0, p)\) 走到 \((n, q)\) 且碰到但不穿过 \(y=0\) 的方案数为:

\(\displaystyle [(C_{n}^{\frac{n+p-q}{2}} - C_{n}^{\frac{n+p+q+2}{2}}) -(C_{n}^{\frac{n+p-q}{2}} - C_{n}^{\frac{n+p+q}{2}})] \times x^{\frac{n+p-q}{2}} \times (m-x)^{\frac{n+q-p}{2}}\)

\(\displaystyle = (C_{n}^{\frac{n+p+q}{2}} - C_{n}^{\frac{n+p+q+2}{2}}) \times x^{\frac{n+p-q}{2}} \times (m-x)^{\frac{n+q-p}{2}}\)

由我们的定义,一条从 \((0, p)\)\((n, q)\) 的路径代表着最终 \(S\)\(1\) 的个数为 \(q\);注意到我们 只关心 \(\bm{q}\) 不关心 \(\bm{p}\),考虑把 \(p\) 换掉,令 \(k = \frac{n+p-q}{2} (k \in [\lceil \frac{n-q}{2} \rceil, n-q])\),则原式为:

\(\displaystyle = (C_{n}^{k+q} - C_{n}^{k+q+1}) \times x^{k} \times (m-x)^{n-k}\)

综上,我们推出的式子为

\(\displaystyle \sum_{x=0}^{m} \sum_{q=0}^{n} \sum_{k=\lceil \frac{n-q}{2} \rceil}^{n-q} q \times (C_{n}^{k+q} - C_{n}^{k+q+1}) \times x^{k} \times (m-x)^{n-k}\)

注意到后面的 \(x^{k} \times (m-x)^{n-k}\) 只与 \(k\) 有关,交换下求和顺序

\(= \displaystyle \sum_{q=0}^{n} \sum_{k=\lceil \frac{n-q}{2} \rceil}^{n-q} q \times (C_{n}^{k+q} - C_{n}^{k+q+1}) \times \sum_{x=0}^{m} (x^{k} \times (m-x)^{n-k})\)

\(F(k) = \sum_{x=0}^{m} (x^{k} \times (m-x)^{n-k})\),原式为

\(= \displaystyle \sum_{q=0}^{n} \sum_{k=\lceil \frac{n-q}{2} \rceil}^{n-q} q \times (C_{n}^{k+q} - C_{n}^{k+q+1}) \times F(k)\)

考虑将 \(k \ge \lceil \frac{n-q}{2} \rceil\) 变形为 \(2k+q \ge n\)

\(= \displaystyle \sum_{q=0}^{n} \sum_{2k+q \ge n}^{n-q} q \times (C_{n}^{k+q} - C_{n}^{k+q+1}) \times F(k)\)

为方便求组合数,换 \(k+q = i\),原式为

\(= \displaystyle \sum_{q=0}^{n} \sum_{k+i \ge n}^{n-q} q \times (C_{n}^{i} - C_{n}^{i+1}) \times F(k)\)

交换下求和顺序,先枚举 \(k\),由 \(i = k+q \ge k\)\(2k+q = i+k \ge n\) 可得

\(= \displaystyle \sum_{k=0}^{n} \sum_{i=\max(k, n-k)}^{n} (i-k) \times (C_{n}^{i} - C_{n}^{i+1}) \times F(k)\)

枚举 \(k\),注意到:

  • \(\displaystyle \sum_{i=\max(k, n-k)}^{n} k(C_{n}^{i} - C_{n}^{i+1})\) 几乎全消了,变成了 \(\displaystyle k \times C_{n}^{\max(k, n-k)}\)
  • \(\displaystyle \sum_{i=\max(k, n-k)}^{n} i(C_{n}^{i} - C_{n}^{i+1})\) 可以用前缀和维护

至此,我们可得 \(O(n^2)\) 做法,瓶颈在于暴力求 \(F(k)\)

快速求 \(F(k)\) 需要用到多项式科技,我不会,咕咕咕

ARC169

ARC169A

题意:给定一棵大小为 \(n\)、以 \(1\) 为根的树,\(i\) 的父亲为 \(p_i\),点权为 \(a_i\),重复 \(10^{100}\) 次,每次从 \(1 \sim n\) 分别将 \(i\) 号点的点权加到父亲的点权上;判断最终 \(1\) 号点点权的正负性

\(2 \le n \le 250000\)\(-10^9 \le a_i \le 10^9\)\(\bm{1 \le p_i < i}\)


考虑拆贡献,设 \(t\) 为轮数,对于一条从根往下的链,在第 \(t\) 轮对根的贡献大致如下

P.S. 横轴从左到右为轮数 \(t\),纵轴从下到上为深度,根的深度为 \(1\)

5 |0 0 0 0 1 
4 |0 0 0 1 4 
3 |0 0 1 3 6  
2 |0 1 2 3 4
1 |1 1 1 1 1
  -----------
   0 1 2 3 4

容易发现在 \(t \rightarrow +\infty\) 时,深度越大贡献越大,初始设 \(d=\max(dep_i)\)

  • \(\sum a_i[dep_i=d] > 0\),则答案为正
  • \(\sum a_i[dep_i=d] < 0\),则答案为负
  • 反之,\(d \leftarrow d-1\)

\(d=1\)\(a_1=0\),则答案为 \(0\)

Bonus:如果求 \(1\) 号点点权在 \(10^{18}\) 轮后对 \(999983\) 取模的结果呢?(P.S. \(999983\) 是质数)

注意到每个点的贡献次数在杨辉三角上,于是 Lucas 求组合数后累加即可

ARC169B

题意:给定正整数 \(s\),对于正整数序列 \(x\),定义 \(f(x)\) 为:

  • \(x\) 分解为几个连续的子序列,对每个连续子序列,其元素之和最多为 \(s\)\(f(x)\) 为该要求下分解出的连续子序列的最小数量

现给定长为 \(n\) 的正整数序列 \(a_i\),求 \(\sum_{1 \le l \le r \le n} f((a_l, a_{l+1}, \cdots, a_r))\)

\(1 \le n \le 2.5 \times 10^5\)\(1 \le S \le 10^{15}\)\(1 \le a_i \le \min(10^9, S)\)


考虑对每个 \(r\) 统计所有右端点为 \(r\) 的区间的贡献

考虑类似扫描线的思想;二分出最靠前的 \(lim\) 使得 \(\sum_{i=lim}^{r} a_i \le s\),同时维护每个左端点对应的最靠后的分界线,不妨设为 \(l_1, l_2, \cdots, l_{r-1}\);此时贡献 \(ans_r\) 为:

  • 首先,令 \(ans_r = ans_{r-1}\)
  • 对于任意 \(l_i < lim\),必须新划出一个子序列 \([l_i+1, r]\),贡献为这样的 \(l_i\) 的个数
  • 此外还会产生一个 \([r, r]\) 的新区间,贡献为 \(1\)

可以使用支持单点加、区间查、区间覆盖的线段树维护

ARC169C

题意:给定长度为 \(n\) 的序列 \(a_i\),一些位置上的元素为 \(-1\),其余每个元素在 \([1, n]\) 之间

你需要给所有为 \(-1\) 的位置填一个 \([1, n]\) 中的整数,满足:

  • 对于任意 \([1, n]\) 中的整数 \(i\)\(i\) 不能在 \(a_i\) 中连续出现超过 \(i\)

求方案数,答案对 \(998244353\) 取模

\(1 \le n \le 5000\)


考虑 dp;最暴力的想法是设 \(f_{i, j, k}\) 表示在第 \(i\) 个位置填 \(j\),包含 \(i\) 的极长连续段长度为 \(k\) 的方案数

转移是容易的:

  • \(f_{i, j, k} \leftarrow f_{i-1, j, k-1}\),表示第 \(i\) 位与第 \(i-1\) 位都填 \(j\)
  • \(f_{i, j, k} \leftarrow \sum f_{i-1, j', k'}\),其中 \(j' \ne j\)\(k=1\),表示第 \(i\) 位与第 \(i-1\) 位不同

不过这样状态数都是 \(O(n^3)\) 的,没有优化空间

注意到一格一格推进 \(k\) 是没有意义的,由于中间填的数都一样,只需确定极长连续段的起点和终点即可

考虑更改状态为 \(f_{i, j}\) 表示在第 \(i\) 个位置填 \(j\) 的方案数

转移时枚举上一段终点的位置 \(k (0 \le k \le i-1)\)

  • \(k = 0\)\(f_{i, j} \leftarrow f_{i, j}+1\),其中 \(i \le j\),同时要求 \([1, i]\) 上的数都为 \(-1\)\(j\)
  • 反之,\(f_{i, j} \leftarrow \sum f_{k, j'}\),其中 \(j' \ne j\)\(i-k \le j\),同时要求 \([k+1, i]\) 上的数都为 \(-1\)\(j\)

直接做是 \(O(n^4)\) 的,我们考虑优化

首先刻画 "\(i-k \le j\),且 \([k+1, i]\) 上的数都为 \(-1\)\(j\)" 的限制;这个东西显然有单调性,直接二分即可 (P.S. 可以 \(O(n^2)\) 预处理,不过带 log 也能过)

对于 \(j' \ne j\) 的限制,可以转化为全部方案数减去第二维为 \(j\) 的方案数

于是前缀和维护 \(tot_i\) 表示 \([1, i]\) 位的方案数之和,\(sum_{i, j}\) 表示 \([1, i]\) 位第二维为 \(j\) 的方案数之和,做完了

**ARC169D

题意:给定一个长度为 \(n\) 的整数序列 \(a_i\),值域为 \([0, n-1]\);你可以执行以下操作任意次:

  • 选择 \(m\) 个元素,将每个所选元素的值增加 \(1\);若其更改后为 \(n\),则将其值改为 \(0\)

最终,你希望使 \(a_i\) 成为 \((0, 1, \cdots, n-1)\) 的排列;无解输出 -1,反之输出最小操作次数

\(2 \le n \le 250000\)\(1 \le m \le n-1\)\(0 \le a_i \le n-1\)


我们不好刻画取模,考虑先把这个限制扔掉

下文所述 \(a_i\) 均指从小到大排序后形成的 \(a_i\)

设最终变成的序列为 \(b_i\),则满足题目要求的充要条件是:

  • \(b_i \bmod n\) 两两不同
  • \(\forall i, b_i \ge a_i\) (显然 \(a_i\) 单调不降)
  • \(\sum_{i=1}^{n} (b_i-a_i) \bmod m = 0\) (可以通过若干次操作抵达)
  • \(\max_{i=1}^{n} (b_i-a_i) \le \frac{sum}{m}\) (不能在操作一个数时加爆)

如果 \(b_i\) 中元素确定但可以自由决定排列顺序,我们必定贪心地希望 \(\max_{i=1}^{n} (b_i-a_i)\) 最小;因此:

  • Key Observation 1:若 \(\bm{b_i}\) 中元素确定,则将其从小到大排序最优

下面是对交换合法性的严谨证明:

  • 对第一条限制,无影响
  • 对第二条限制,不妨设交换前存在 \(i < j\)\(b_i > b_j\),交换后:
    • 对于位置 \(i\)\(b_j \ge a_j > a_i\),合法
    • 对于位置 \(j\)\(b_i > b_j \ge a_j\),合法
  • 对第三条限制,无影响

进一步的,考虑刻画 \(b_i\) 中元素的取值;注意到答案只与 \(\sum_{i=1}^{n} (b_i-a_i)\) 有关,手模一下,事实上,我们有:

  • Key Observation 2:\(\bm{b_i}\) 中元素必可以表示为 \(\bm{(x, x+1, x+2, \cdots, x+n-1)}\)

这等价于去证 \(b_n-b_1< n\);考虑调整法,若 \(b_n-b_1 \ge n\),则令 \(b_1' = b_n-n, b_n' = b_1+n\)

  • 对于第一条限制,加减 \(n\) 不影响 \(\bmod n\) 的结果
  • 对于第二条限制,有 \(b_1' = b_n-n \ge b_1 \ge a_1\),同时 \(b_n' = b_1+n \ge a_1+n \ge a_n\)
  • 对于第三条限制,加 \(n\)\(n\) 抵消了,不影响元素和
  • 对于第四条限制,改变的只有 \(b_n'-a_n\)\(b_1'-a_1\)
    • 由于 \(b_n-b_1 \ge n\)\(b_n \ge b_1+n\),则有 \(b_n-a_n \ge b_1+n-a_n = b_n'-a_n\)
    • 由于 \(a_1+n \ge a_n\)\(b_n-a_n \ge b_n-n-a_1 = b_1'-a_1\)
    • 综上,\(\max_{i=1}^{n} (b_i-a_i) \ge b_n-a_n \ge \max_{i=1}^{n} (b_n'-a_n)\),证毕

注意,证明过程中并不要求调整后的 \(b_i\) 保持大小关系;根据重排的合法性,调整后再排序即可,这样能够保持 \(b_i\) 始终有序

那么我们如何确定 \(x\)?不妨看看四条限制对 \(x\) 的影响:

  • 第一条限制自然满足
  • 第二条限制本质上是 \(x \ge \max_{i=1}^n (a_i-i+1)\),限制了 \(x\) 的下界
  • 第三条限制不好刻画,不过你注意到此时 \(x\)\(x+m\) (更精确的,\(x+\frac{m}{gcd(n, m)}\)) 等价,于是枚举即可
  • 对第四条限制,当 \(x \leftarrow x+1\),不等式左侧 \(+1\),右侧 \(+\frac{n}{m}\),大于 \(+1\);换句话说,这一限制随着 \(x\) 增大越来越松;又因为 \(\max_{i=1}^{n} (b_i-a_i)\) 顶多是 \(O(nm)\) 级别的,我们又要求 \(\sum_{i=1}^{n} (b_i-a_i)\)\(m\) 的倍数,真正有用的 \(x\) 实际上也是 \(O(n)\) 级别的

具体的,我们通过第二条限制求出 \(x\) 的下界 \(x'\),枚举 \(x'' \in [x', x'+m]\) 找出第一个满足第三条限制的 \(x''\);最后一直跳 \(\frac{m}{gcd(n, m)}\) 即可

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

(*)**ARC169E

题意:现有一场淘汰制锦标赛,共有 \(2^n\) 名选手,编号分别为 \(1 \sim 2^n\);比赛进行 \(n\) 轮,每轮两两对战,编号小者获胜

给定一个长为 \(2^n\) 的字符串 \(S\),由RB组成;若比赛过程中两名同为 R 的选手进行了比赛,则称这场比赛是"无趣的"

你希望恰当安排选手比赛的顺序,使得没有比赛是"无趣的"

你要对 \(S\) 进行若干次修改,每次形如交换相邻的两个元素;请求出至少需要交换多少次才能达成目标;无解输出 \(-1\)

\(1 \le n \le 18\)


首先考虑转化为判定问题,即给定 \(S\),如何判断其合法;

显然每个B越靠前越好;因此,我们贪心地希望靠前的R消掉尽量靠后的B,靠前的B消掉尽量靠前的R

考虑无解情况;事实上,R的数量大于B的数量时必然无解,因为每个B最多消掉一个R,最终肯定会剩下至少 \(2\)R;反过来,稍微想想可得,将所有B都换到前面去就是一种有解方案

现在带上交换操作

无解情况的本质是B太靠后;当然,在我们比赛的过程中会出现一些 B-B 配对,这样的配对中多余的B是无用的,将其换为R也不会影响答案;因此我们只考虑 RB 数量相同时的操作方式

这里的思想是 朝着最劣的有解情况调整;具体的,我们想要找到B的数量尽量少,且每个B的位置都尽量靠后的有解情况,再根据其调整现有情况中的B

\(T(n)\) 为长度为 \(2^n\) 的最劣有解情况,\(a_i\)\(S\) 中第 \(i\)B的位置,\(b_i\)\(T(n)\) 中第 \(i\)B的位置;对于每个 \(a_i\)

  • 若调整至 \(b_i\) 之前,相对调整到 \(b_i\),消去的R数量是不变的,在若干轮比赛后会处于同一位置;同理,我们无需考虑之前的位置小于 \(b_j\) 的另一个B带来的影响
  • 若调整至 \(b_i\) 之后,相对调整到 \(b_i\),消去的R数量会减少,将导致前面的R逐渐累积,最终不满足要求

综上,将每个 \(a_i\) (此处 \(a_i > b_i\)) 调整到 \(b_i\) 是最优的;答案即为 \(\sum \max(a_i-b_i, 0)\)

下面考虑如何生成 \(T(n)\)

按照一开始提到的贪心策略的最劣情况构造,换句话说,我们希望 靠前的R消去的B尽量靠后,靠前的B消去的R尽量靠前

考虑如何从 \(T(i-1)\) 生成 \(T(i)\),从前往后考虑第 \(j\) 位:

  • \(T(i-1)\) 的第 \(j\) 位为R,我们贪心地让这个R匹配的B最靠后,在 \(T(i)\) 后添上R,在 \(T(i)\) 最后添上 B
  • \(T(i-1)\) 的第 \(j\) 位为B,我们贪心地让这个B立刻匹配R,在 \(T(i)\) 后添上BR

初始情况是 \(T(0)\)R

P.S. 由于笔者不会严谨证明,此处只是感性理解

***ARC169F

题意:给定长为 \(n\) 的数列 \(a_i, b_i, x_i, y_i\),保证 \(a_i, b_i\) 构成一组 \(1, 2, \cdots, 2n\) 的排列且 \(a_1 = 1, b_1 = 2\);定义数组 \(d_{i, j}\),其中 \(d_{1, 1} = 0\),对于 \(d_{i, j}\)

  • \(a_i < b_j\),则 \(d_{i, j} = d_{i, j-1}+x_i\)
  • 反之,\(d_{i, j} = d_{i-1, j}+y_j\)

\(\sum_{i=1}^{n} \sum_{j=1}^{n} d_{i, j}\)\(998244353\) 的结果

\(2 \le n \le 2.5 \times 10^5\)\(1 \le x_i, y_i \le 10^9\)


我们肯定考虑拆贡献

在整个 dp 表中,考虑每个格子的转移形成的路径;对于行 \(i\),每当有一条路径从 \((i, j-1) \rightarrow (i, j)\) 时,\(x_i\) 就会被统计一次

P.S. 行和列的贡献本质相同,下文暂时只讨论行的贡献

注意到如果从上向下 / 右走,下一步走到哪不直接取决于当前格子的坐标,这是不好的;因此我们考虑从每个格子向上 / 左走形成的路径

现在考虑如何刻画 "有一条路径从 \((i, j-1) \rightarrow (i, j)\)";显然这条路径的起点 \((x, y)\) 必须满足 \(i \le x \le n, j \le y \le m\),换句话说,其在左上角为 \((i, j)\)、右下角为 \((n, m)\) 的矩形范围中

我们还需要保证其不能从矩形的上边出去;有结论,在转移限制中,真正影响起点为 \((x, y)\) 的路径从哪个方向出去的只有 \(\bm{\min a_{i \sim x}}\)\(\bm{\min b_{j \sim y}}\);具体的:

  • \(\min a_{i \sim x} < \min b_{j \sim y}\),则路径在走到 \(a\) 中最小值那行时会一直向左走,直到出去
  • 反之,类似的,走到 \(b\) 中最小值那行时会一直向上走,直到出去

用式子表达出来,从矩形左侧出来的路径数量就是 \(\sum_{x=i}^{n} \sum_{y=j}^{m} [\min a_{i \sim x} < \min b_{j \sim y}]\)

不过我们现在求的是恰好在 \(i\) 这一行出来的路径数量;这只需差分一下即可,用从 \([i, n]\) 出来的数量减去从 \([i+1, n]\) 出来的数量;表达式为:

\[\sum_{x=i}^{n} \sum_{y=j}^{m} [\min a_{i \sim x} < \min b_{j \sim y}] - \sum_{x=i+1}^{n} \sum_{y=j}^{m} [\min a_{i+1 \sim x} < \min b_{j \sim y}] \]

总贡献还需要再乘上系数 \(x_i\)

考虑同时求出每行的贡献;注意到每行的式子形式大致相同,只是 \(x_i\) 稍微错了一下,以 \(3 \times 3\) 为例,我们把每格的系数写出来:

x1    x1    x1
x2-x1 x2-x1 x2-x1
x3-x2 x3-x2 x3-x2

这恰好是差分的形式;稍微分析一下,我们将所有 \(x_i\) 改为 \(x_i-x_{i-1}\) 即可 (\(x_0 = 0\))

此时,行的总贡献就是:

\[\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{x=i}^{n} \sum_{y=j}^{m} x_i[\min a_{i \sim x} < \min b_{j \sim y}] \]

注意到上述式子的本质就是 比较 \(a\) 中一段区间的最小值与 \(b\) 中一段区间的最小值的大小关系,于是我们可以对 \(a\)\(b\) 按照最小值分别处理

具体的,预处理 \(f_{a, v}\) 代表 \(\sum_{l=1}^{n} \sum_{r=l}^{n} [\min a_{l \sim r} = v]\)\(g_{a, v}\) 代表 \(\sum_{l=1}^{n} \sum_{r=l}^{n} x_l[\min a_{l \sim r} = v]\)\(f_{b, v}\)\(g_{b, v}\) 同理

此时原式即为:

\[\sum_{i=1}^{2n} \sum_{j=i+1}^{2n} g_{a, i} \times f_{b, j} \]

拼上列的贡献,总贡献为:

\[\sum_{i=1}^{2n} \sum_{j=i+1}^{2n} g_{a, i} \times f_{b, j} + \sum_{i=1}^{2n} \sum_{j=i+1}^{2n} g_{b, i} \times f_{a, j} \]

很容易用前缀和把式子优化成 \(O(n)\)

对于 \(f_{a, v}\)\(g_{a, v}\) 的预处理,可以考虑笛卡尔树;以小根堆建立笛卡尔树,对于节点 \(u\),小根堆的性质保证了 \(u\) 的子树中所有元素都比其大,同时有经典结论,\(u\) 的子树中的下标连续 (可以通过分析笛卡尔树建树过程 + 归纳法简单证明);于是我们只需要维护子树中的最小编号与最大编号,dfs 一次即可

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

ABC404

*ABC404F

题意:有 \(N\) 个外观相同的按钮,其中有一个是胜利按钮,其余 \(N-1\) 个都是失败按钮

Aoki 和 Takahashi 在进行一个游戏,这个游戏将重复如下操作 \(T\) 次:

  1. Aoki 随机打乱这 \(N\) 个按钮
  2. Takahashi 重复 "选择一个按钮按一次" 的操作 \(M\) 次;他可以选相同的按钮
  3. Aoki 告诉 Takahashi 从游戏开始到现在,胜利按钮一共被按下了多少次

称 Takahashi 胜利,当且仅当 \(T\) 次操作结束后,胜利按钮被按下 \(\ge K\)

假设 Takahashi 足够聪明,求出他胜利的概率

\(1 \le N \le 2 \times 10^5\)\(1 \le T, M, K \le 30\)


其实在发现贪心很难考虑后,就应该及时回头想想 dp 了

不妨照着题意设状态;具体的,我们设 \(dp_{t, k}\) 表示 \(t\) 轮后胜利按钮被按下 \(k\) 次时的胜利概率,概率 dp 从后向前转移

不妨设第 \(i\) 个按钮在当前轮中被按了 \(c_i\) 次;转移即为:

\[dp_{t, k} \leftarrow \max_{c_1+c_2+\cdots+c_N = M} \frac{1}{N} \sum dp_{t+1, k+c_i} \]

考虑如何优化转移

可以考虑往里套一个背包,对于 \(dp_{t, k}\),设:

\[f_{i, s} = \max_{c_1+c_2+\cdots+c_i = s} \sum dp_{t+1, k+c_i} \]

相应的,\(dp_{t, k}\)\(f\) 之间的关系为 \(dp_{t, k} = \frac{1}{N} f_{N, M}\)

不过 \(N\) 的范围高达 \(2 \times 10^5\),直接背包绝对会炸;你注意到有值的 \(c_i\) 最多只有 \(M\),且 \(c_i\) 的顺序对最终转移没有影响,因此我们不妨令 \(0\) 都在最后出现

稍微更改下状态,令:

\[f_{i, s} = \max_{c_1+c_2+\cdots+c_i = s, \forall c_i > 0} \sum dp_{t+1, k+c_i} \]

相应的,\(dp_{t, k}\)\(f\) 之间的关系为 \(dp_{t, k} = \frac{1}{N} \max (f_{j, M} + (N-j)dp_{t+1, k})\),其中 \(1 \le j \le \min(N, M)\)

那么我们只要确定 \(f\) 就可以 \(O(M)\) 算出 \(dp_{t, k}\)

对于 \(f\) 的转移,直接背包即可,为 \(f_{i, s} \leftarrow f_{i-1, s'}+dp_{t+1, k+s-s'}\) (其中 \(1 \le s' < s\)),复杂度 \(O(M^3)\)

\(f\) 初始全 \(0\) 即可,\(dp\) 的初始值为 \(dp_{T, K} = 1\);答案即为 \(dp_{0, 0}\)

时间复杂度 \(O(TKM^3)\)

posted @ 2025-03-12 19:44  lzlqwq  阅读(106)  评论(0)    收藏  举报