AGC058 题解
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\) 次,可以通过。
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)\)。
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)\)。
D. Yet Another ABC String (3200)
做了半天,丢脸死了
限制显然要用容斥,但没有现成的系数可用。
用经典套路,考虑给每个长度 \(l\) 赋一个权 \(g_l\),使得其任意拼接恰好得到正确的权:
计算得 \(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\),插板得到系数为:
那么事实上后面这个很难看的东西是可以 \(O(1)\) 计算的:
预处理后总时间复杂度 \(O(A+B+C)\)。
Solving AGC 058 D with multivariate generating functions - adamant
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)\)。
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)\)。