AGC058 题解

xyx更好的阅读体验

Problems as pleasant as always -- antontrygubO_o

A. Make it Zigzag (1100)

考虑一个暴力做法:

  • 依次遍历 \(i=1,2,\cdots,2n-1\),若 \(a_i\)\(a_{i+1}\) 的大小关系错误则交换。

这样至多操作 \(2n-1\) 次,无法通过(但是只有一个点过不去)。

考虑用一次同时操作三个数的两个相对关系:

  • 依次遍历 \(i=1,3,\cdots,2n-3\),可以用操作 \(a_i,a_{i+1},a_{i+2}\) 中的某两个使 \(a_i<a_{i+1},a_{i+1}>a_{i+2}\)
  • 最后一次操作 \(a_{2n-1}\)\(a_{2n}\) 即可。

至多操作 \(n\) 次,可以通过。

Code

B. Adjacent Chmax (2100)

某道题的弱化版,出过 114514 遍了

\(L_i\) 表示 \(p_i\) 左边最近的比它大的数的位置,\(R_i\) 表示 \(p_i\) 右边最近的比它大的数的位置。

容易发现能得到序列 \(\{q_i\}\) 的充要条件是:

  • 对于每个数 \(t \in [1,n]\)\(t\) 出现的位置形成连续段。

  • 对于每个 \(q_i=t\),都满足 \(L_t<i<R_t\)

  • 对于每个 \(i \in [1,n)\)\(a_i\) 都在 \(a_{i+1}\) 之前出现。

\(dp_{i,t}\) 表示前 \(i\) 个位置填了 \(a_1,a_2,\cdots,a_t\) 中的数(且之后不再填)的方案数,转移即可。

前缀和优化可做到 \(O(n^2)\)

Code

C. Planar Tree (3000)

大胆猜结论

结论:对于任意一种情况,如果有解,则必然有两个相邻的数相连且其中一个是叶子。

证明:归纳证明。\(n=2\) 时显然;对于 \(n>2\),任选一条边将整个环分成两半四棵树,其中一定有一棵至少有 \(2\) 个点,那么由归纳假设成立。

那么首先需要做一些处理:

  • 如果有 \(1/4\)\(2/3\) 相邻,则将 \(1/4\) 删去。(\(1/4\) 可以直接连向 \(2/3\) 且这样最优)

  • 如果有两个相同的数相邻,则将其中一个删去。(删去的一个可以复制另一个的连法)

做完处理后,相邻能连的边只有 \(2-3\) 了。考虑令其中一个作为叶子删去后会发生什么:

  • 如果删去 \(2\):如果左右是 \(3,4\),那么会再删去 \(4\);如果左右是 \(3,3\),那么会再删去 \(3\)

  • 如果删去 \(3\):如果左右是 \(2,1\),那么会再删去 \(1\);如果左右是 \(2,2\),那么会再删去 \(2\)

故删去的 \(1\) 的数量不超过 \(3\),删去的 \(2\) 的数量不超过 \(4\)

\(1,2,3,4\) 的数量分别为 \(c_1,c_2,c_3,c_4\),那么有解的必要条件是 \(c_3 > c_1,c_4 > c_2\)

事实上这也是充分条件。由于 \(c_2+c_3>c_1+c_4\),故一定存在长度不小于 \(2\)\(2,3\) 连续段,取这个连续段的最边界两个与外面的一个操作即可删去一个 \(1/4\)

那么只需要数一数就行了,总时间复杂度 \(O(\sum n)\)

Code

D. Yet Another ABC String (3200)

做了半天,丢脸死了

限制显然要用容斥,但没有现成的系数可用。

用经典套路,考虑给每个长度 \(l\) 赋一个权 \(g_l\),使得其任意拼接恰好得到正确的权:

\[\dfrac{1}{1-G(x)}=F(x)=1+x+x^2 \]

\[G(x)=1-\dfrac{1}{F(x)} \]

计算得 \(G(x)=x-x^3+x^4-x^6+x^7-x^9+x^{10}-\cdots\)(可以通过整式递推说明)。那么接下来用这个系数拼接即可。

注意到 \(l \bmod 3=2\)\(g_l=0\),不需要考虑。设共分成了 \(i\) 段,其中 \(t\) 段长度 \(\bmod 3=1\),插板得到系数为:

\[\dbinom{A+B+C-3x}{A-x,B-x,C-x} \sum\limits_{i=t}^{x+t} (-1)^{i-t} 3^{i-t} \dbinom{i}{t} \dbinom{x+t-1}{i-1} \]

那么事实上后面这个很难看的东西是可以 \(O(1)\) 计算的:

\[\begin{aligned} S&=\sum\limits_{i=t}^{x+t} (-1)^{i-t} 3^{i-t} \dbinom{i}{t} \dbinom{x+t-1}{i-1}\\ &=\sum\limits_{i=0}^{x} (-3)^{i} \dbinom{i+t}{t} \dbinom{x+t-1}{i+t-1}\\ &=\sum\limits_{i=0}^{x} (-3)^{i} \dfrac{i+t}{x} \dbinom{x}{i} \dbinom{x+t-1}{x-1}\\ &=\dbinom{x+t-1}{x-1} \dfrac{t}{x} \sum\limits_{i=0}^{x} (-3)^{i} \dbinom{x}{i} + \dbinom{x+t-1}{x-1} \dfrac{1}{x} \sum\limits_{i=0}^{x} (-3)^{i} i \dbinom{x}{i}\\ &=\dbinom{x+t-1}{x-1} \dfrac{t}{x} \sum\limits_{i=0}^{x} (-3)^{i} \dbinom{x}{i} + \dbinom{x+t-1}{x-1} \sum\limits_{i=0}^{x-1} (-3)^{i+1} \dbinom{x-1}{i}\\ &=\dbinom{x+t-1}{x-1} \dfrac{t}{x} (-2)^x -3 \dbinom{x+t-1}{x-1} (-2)^{x-1}\\ &=- (-2)^{x-1} \dbinom{x+t-1}{x-1} \dfrac{2t+3x}{x} \\ \end{aligned} \]

预处理后总时间复杂度 \(O(A+B+C)\)

Solving AGC 058 D with multivariate generating functions - adamant

Code

E. Nearer Permutation (3800)

又是最有意思的题

Part 1

为了方便,下标均为从 \(0\) 开始。记 \(Inv(x)\) 表示序列 \(x\) 的逆序对数。

先来考虑如何求 \(f(x)\)。从前到后一位一位填数,每次在满足要求的前提下填尽量小的。具体而言:

  • 初始令 \(s=\lfloor \dfrac{Inv(x)}{2} \rfloor\) 表示 \(\lfloor \dfrac{d(y,z)-d(x,z)}{2} \rfloor\)。重复进行以下操作 \(n\) 次:
    • \(x_0,\cdots,x_s\) 中最小的为 \(x_m\),那么将 \(x_m\) 加入 \(z\) 的末尾并从 \(x\) 中删去,令 \(s \leftarrow s-m\)(将 \(x_m\) 放到最前面后 \(d(y,z)\) 减少了 \(m\)\(d(x,z)\) 增加了 \(m\))。
  • 最后 \(z=f(x)\)

Part 2

注意到上述过程大部分情况下每次取出的数是递增的(\(s\) 在不断减小),下降的条件非常苛刻。但 \(a\) 却不仅仅只有 \(1,2,\cdots,n\) 一种,怎么回事呢?

从这里入手,设 \(k\) 使得 \(A_0<A_1<\cdots<A_k\)\(A_k>A_{k+1}\)。如果不存在这样的 \(k\) 那么显然 \(f(A)=A\) 合法。

那么使 \(a_k>a_{k+1}\) 只有一种办法:第 \(k+1\) 次操作中 \(A_{k+1}\)\(x_{s+1}\) 的位置,而 \(A_k\)\(x_0\) 的位置导致删掉后 \(s\) 不变小;第 \(k+2\) 次中 \(A_{k+1}\) 正好在 \(x_{s}\) 的位置被选中。那么之后 \(s\) 就一直是 \(0\) 了,也就只能顺序选。

于是操作 \(k\) 次后的 \(x\) 需要满足:

  • \(x_0=A_k\)\(x_{\lfloor s/2 \rfloor+1}=A_{k+1}\)
  • \(x_0 = \min\{x_0,x_1,x_2,\cdots,x_{\lfloor s/2 \rfloor}\}\)
  • \(A_{k+2},A_{k+3},\cdots,A_{n-1}\) 按顺序排列。

Part 3

\(B=A\),那么 \(x\) 可以由 \(B\) 通过以下操作得到:

  • 对于每个 \(i=k+1,k-1,k-2,\cdots,0\),将 \(B_i\) 向右移动 \(c_i\) 步。

设(求 \(f(x)\) 的算法中)操作 \(k+1\) 步后逆序对数为 \(2q\)\(A_{k+1}\) 的位置为 \(p\)

考虑 \(c_i\) 增减对 \(q-p\) 的影响:

  • \(i=k+1\),则 \(c_i\) 增加 \(1\)\(q\) 增加 \(\dfrac{1}{2}\)\(p\) 增加 \(1\)\(q-p\) 减少 \(\dfrac{1}{2}\)
  • \(i \neq k+1\),则 \(c_i\) 增加 \(1\)\(q\) 增加 \(\dfrac{1}{2}\),但 \(A_i\) 的下标也增加了 \(1\),于是 \(q\) 又会减少 \(1\)。故 \(q-p\) 减少 \(\dfrac{1}{2}\)

综上,\(c_i\) 增加 \(1\)\(q-p\) 减少 \(\dfrac{1}{2}\)

\(k+1\) 步后 \(\lfloor \dfrac{q}{2} \rfloor=0\),故 \(\sum c_i=Inv(A)\)\(Inv(A)-1\),即 \(Inv(x)=2Inv(A)\)\(2Inv(A)-1\)(实际上只需判断后者即可,后文有解释)。于是我们获得了初始的 \(s\)

Part 4

先把 \(c_i\) 抛到一边,改为从前到后将 \(B_0,B_1,\cdots,B_{k-1},B_{k+1}\) 向后移动。

假设已经知道了 \(B_{i+1},B_{i+2},\cdots,B_{n-1}\),设 \(B_i\) 向后移动 \(t\) 步,那么要求:

  • \(B_{\min(i,k)}=\min\{B_i,B_{i+1},\cdots,B_{i+s}\}\)
  • \(t \leq s\)

然后令 \(s \leftarrow s-t\)

注意到 \(A_0<A_1<\cdots<A_k\),故越往后第一个条件就越难满足。那么使 \(t\) 尽量大贪心即可。

同时注意到这样贪心时,\(A_{i+1}\) 移动一定不会比 \(A_i\) 远(除了 \(A_{k+1}\)),故:

  • \(i+s<k+1\)\(\min\{B_i,B_{i+1},\cdots,B_{i+s}\}=\min\{A_i,A_{i+1},\cdots,A_{i+s}\}\)
  • 如果 \(i+s \geq k+1\),意味着 \(A_{k+1}\) 至少要移动到 \(i+s+1\)(注意给 \(A_{k+1}\) 留位置)。然后可以看作 \(\min\{B_i,B_{i+1},\cdots,B_{i+s}\}=\min\{A_i,A_{i+1},\cdots,A_k,A_{k+2},\cdots,A_{i+s}\}\)

那么这样贪心,最后若 \(s=0\) 则有解,否则无解。

由这个贪心算法可以看出初始的 \(s\) 越小越可能有解,故实际只需判断初始 \(s=Inv(A)-1\) 是否有解即可。

总时间复杂度 \(O(\sum n \log n)\)

Code

F. Authentic Tree DP (???)

没人想得到的双射题

首先肯定要转化,但转化成什么呢?

结论:在每条边上新建节点(称为特殊点),再在这个新建的节点上添加 \(P-1\) 个叶子。给每个点赋一个 \([0,1]\) 中的值 \(v_i\),则原题的答案在 \(\bmod P\) 意义下等于每个特殊点的值均大于其邻居值的概率。

证明:考虑所有点的值中最大的点,该点一定是特殊点。而某个特殊点的值最大的概率为 \(\dfrac{1}{n+(n-1)+(n-1)(P-1)} \equiv \dfrac{1}{n} \pmod P\),故递推式与原题相同。

接下来只需要处理新问题。

先定根,然后对 \(v_i>v_{fa_i}\)\(i\) 是特殊点)容斥。即钦定一些 \(v_i<v_{fa_i}\),此时所有限制都形如父亲的值大于儿子

对于每个由限制构成的联通块 \(S\),概率即 \(\prod\limits_{u \in S} \dfrac{1}{siz_u}\)

于是考虑树形 DP,设 \(dp_{u,i}\) 表示原树 \(u\) 的子树中 \(u\) 所在的联通块大小为 \(i\) 时合法的概率,树形依赖背包转移即可。

由树形依赖背包转移的复杂度证明,总时间复杂度 \(O(n^2)\)

Code

posted @ 2022-08-21 19:05  苹果蓝17  阅读(239)  评论(0编辑  收藏  举报