AGC057 题解

Nice, 57th AGC on May 7. I guess 58th AGC will be the next time May 8 is Saturday? --Radewoosh

A. Antichain of Integer Strings (1400)

\(f(x)\) 表示最小的包含 \(x\) 为子串的整数,则 \(f(x)=\min(\overline{1}X,X\overline{0})\)

注意到包含是有传递关系的,且由 \(x\)\(f(x)\) 连边会形成若干条链,故答案即为链的数量。

链的数量即链底数量,即求 \(x \in [L,R],f(x)>R\)\(x\) 的数量。注意到 \(f(x)\) 单调不降,二分即可。

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

Code

B. 2A + x (2000)

不保证结论及证明完全正确

反正暴力碾过去了

若一个数 \(a\) 被操作 \(t\) 次,其可以变为 \([2^ta,2^ta+(2^t-1)x]\) 中的任意一个整数。下面使用区间代表每一个数可取的范围。

结论:存在一组最优解使得每个数被操作不超过 \(\lceil \log_2 \max\{a_i\} \rceil+\lceil \log_2 X \rceil\) 次。

证明:先考虑答案不为 \(0\) 的情况。考虑某一状态右端点最小的为 \([A,B]\),左端点最大的为 \([C,D]\),该状态下最小极差即 \(C-B\)
将所有数都操作一遍,这两个区间分别变为 \([2A,2B+X]\)\([2C,2D+X]\),极差变为 \(2C-2B-X\)。极差变小当且仅当 \(C-B<X\),但若此式成立,极差严格递减,最终答案为 \(0\),矛盾。故所有数都被操作的情况一定不优。
在有数被操作超过 \(\lceil \log_2 \max\{a_i\} \rceil\) 次后,若还有数未被操作一定不优。因此最优解一定在每个数被操作不超过 \(\lceil \log_2 \max\{a_i\} \rceil\) 的情况内。

再考虑答案为 \(0\) 的情况。区间可以写为 \(2^t[a,a+X-\dfrac{X}{2^t}]\),在 \(t \rightarrow +\infty\) 时等价于 \(2^t[a,a+X)\)
考虑对所有 \(a\) 进行 \(k=\lceil \log_2 X \rceil\) 次操作后变为 \([2^ka,2^ka+2^kX-X]\),右端点 \(2^ka+2^kX-X \geq 2^ka+2^kX-2^k=2^k(a+X-1)\),故已经等价于 \([a,a+X]\)。再对每个数进行至多 \(\log_2 \max\{a_i\}\) 次操作即可使极差为 \(0\)

综上,维护两个 set,每次对右端点最小的区间操作,直到所有数都不小于 \(X \max\{a_i\}\),即可得到答案。

时间复杂度 \(O(n\log n (\log \max\{a_i\} + \log X))\)

Code

C. Increment or Xor (3400)

低位到高位(与常见的顺序不同)建出 \(\text{Trie}\) 树,将每个值在序列中对应的位置填在叶子上。

可以算出每个节点是否应该打上翻转标记(或判断无解)。

考虑两种操作的效果:

  • 加法操作:相当于给目前由根不断向右走(即到值 \(2^n-1\))的链上打上翻转标记。

  • 异或操作:将某些层的节点打上翻转标记。

只要进行一些操作后使得每一层的颜色相同即可一次异或解决。

由这两种操作可以组合出一种新操作(x -1 x):给由根到节点 \(x \oplus (2^n-1)\) 的链上打上翻转标记。

于是把倒数第二层的节点变为同色后再判断每一层颜色是否相同即可。

注意操作后节点的位置会发生变化,需要动态维护。

时间复杂度 \(O(n2^n)\),操作次数 \(O(2^n)\)

Code

D. Sum Avoidance (3300)

首先考虑长度。将 \([1,S-1]\) 分为 \((1,S-1),\cdots\)\(\dfrac{S-1}{2}\) 组,则每组内至多选择一个数。故长度 \(n=\lfloor \dfrac{S-1}{2} \rfloor\),可由 \((\lfloor \dfrac{S}{2} \rfloor+1,\cdots,S-2,S-1)\) 达到。

下面称 \([1,\lfloor \dfrac{S}{2} \rfloor]\) 的数为低位,\([\lfloor \dfrac{S}{2} \rfloor+1,S-1]\) 的数为高位。

要求字典序最小,实际上是将一些高位的数替换为低位,使其还满足要求。

下面考虑替换为低位的数的限制,可以发现等价于:

  • 低位的数不能线性组合出 \(S\)

  • 低位的数能线性组合出的另一个低位数必须被加入(等价于低位数与高位数不能组合出 \(S\))。

一个简单的贪心算法是从小到大尝试加入低位,若其与已加入的低位不能线性组合出 \(S\) 则加入。

考虑到第 \(2\) 点限制其实是很强的性质,意味着设低位中最小的数为 \(d\),则若 \(x\) 被加入,则 \(x+kd\) 也被加入。

故将所有数按模 \(d\) 分类,维护每一类被加入的最小的数,同时维护每一类能被线性组合出的最小的数。每次枚举每一类算出该类能被加入的最小的数(这里还需要枚举乘的系数),取最小的加入即可。复杂度 \(O(d^3)\)

求出每一类被加入的最小的数后容易二分求解,复杂度 \(O(d \log S)\)

注意到 \(d\) 为最小的不整除 \(S\) 的正整数,是 \(O(\log S)\) 级别的。故总时间复杂度 \(O(T \log^3 S)\)

Code

E. RowCol/ColRow Sort (4100)

个人感觉这一场最有意思的题

考虑如何判断一个矩阵是否合法。

由排序网络的 0-1 原理,对于每个 \(k\),将不超过 \(k\) 的数涂黑,得到 \(A_k\)\(B_k\)。若 \(A_k\) 按两种方式排序后都得到 \(B_k\),则合法。

记矩阵 \(M\) 的每行黑格子数的可重集为 \(R_M\),每列黑格子数的可重集为 \(C_M\)

引理:对于所有按行或按列排序后的 \(n\)\(m\) 列矩阵 \(M\)\(f:{R_M} \rightarrow C_M\) 构成双射。
证明:不妨设 \(M\) 按行有序。将所有列按照黑格数量递减排序,显然 \(R_M\)\(C_M\) 不变,而此时 \(M\) 按列也有序,故 \(R_M\)\(C_M\) 唯一对应。

结论:矩阵 \(A\) 合法当且仅当 \(R_A=R_B,C_A=C_B\)
证明:将 \(A\) 按行排序后得到 \(A'\),有 \(R_A=R_{A'}\)。由于 \(A'\) 按列排序后得到 \(B\),故 \(C_{A'}=C_B\)。由引理,\(R_{A'}=R_B\),故 \(R_A=R_B\)。同理 \(C_A=C_B\),可证得必要性,而充分性显然。

注意到颜色数很少,不妨按颜色分层。对于每个 \(k\),只需要计算出在 \(B_{k+1}\) 中填出 \(B_k\) 的方案数,全部相乘即可得到答案。即,将 \(B_{k+1}\) 按行列排序后得到 \(B'_{k+1}\),在黑格中选一些格子,选出的格子组成矩阵的 \(M\) 满足 \(R_M=R_{B_{k}},C_M=C_{B_{k}}\)

由于引理,\(M\) 由且仅由 \(B_k\) 交换一些行列得到。不妨设行交换的排列为 \(p_1,\cdots,p_n\),列交换的排列为 \(q_1,\cdots,q_m\)。只需要满足:

\[B_{k_{i,j}}=1 \Rightarrow B'_{k+1_{p_i,q_j}}=1 \]

\(a_i\) 表示 \(B_k\)\(i\) 行的黑格数,\(b_i\) 表示 \(B'_{k+1}\)\(j\) 列黑格数,则条件等价于:

\[j \leq a_i \Rightarrow p_i \leq b_{q_j} \]

\[\forall i \in [1,n],p_i \leq b_{\max\{q_1,q_2,\cdots,q_{a_i}\}} \]

注意到 \(\{a_i\}\)\(\{b_i\}\) 均单调不增,考虑按 \(x=\max\{q_1,q_2,\cdots,q_{a_i}\}\) 从后向前 DP。

\(f_{i,j}\) 表示 \(\max\{q_1,q_2,\cdots,q_i\}=j\) 的方案数,可以在转移时维护 \(\{q_i\}\) 的方案数。再维护一个指针 \(t\),容易在 \(a_t=i\) 时计算 \(\{p_i\}\) 的方案数:

\[f_{i,j} \leftarrow (j-i+1) f_{i-1,j}+\sum\limits_{k<j} f_{i-1,k} \]

\[f_{i,j} \leftarrow (b_j-t+1) f_{i,j} \]

最后由于 \(R_k,C_k\) 中重复的数会被计算多次但方案是相同的,所以要除掉可重排。注意 \(a_i,b_j=0\) 的要删掉,不然会算重。

前缀和优化可做到 \(O(nm+m^2)\)。总时间复杂度 \(O(B_{i,j}(nm+m^2))\)

Code

F. Reflection (4100)

特别友善的 AGC F

显然 \((A,B,C)\) 本质上只与 \((B-A,C-B)\) 有关。且考虑转化后的二元组,\((X,Y)\) 经过一次变换后可以变成 \((\min(X,Y),|X-Y|)\)\((|X-Y|,\min(X,Y))\)

对于二元组 \((X,Y)\),还需要计数与之对应的 \((A,B,C)\) 的数量。用 \(B\) 来计数,则经过一次变换后 \(B\) 会变为 \(B+\min(X,Y)\)\(B-\min(X,Y)\)

变换总会有这样的形式:

(图来自 官方题解

每一个方格对应一种 \((X,Y)\),并且注意到 \(X,Y\) 排列的顺序只与最后一次操作有关。故只需要解决以下问题:

  • 有序列 \(a_1,\cdots,a_1,a_2,\cdots,a_k,\cdots,a_k,1\),对每一个前缀求其中的数背包起来能组成的数的数量。

由于这个过程相当于辗转相除,故 \(k\)\(O(\log V)\) 级别的。

\(a_i\) 出现了 \(n_i\) 次(虽然 \(a_k=1\),但最后的 \(1\) 不认为在 \(n_k\) 内),则对 \(i \in [1,k-2]\) 满足 \(a_i=a_{i+1}n_{i+1}+a_{i+2}\)

若不考虑最后的 \(1\),若一种方案中同时选了 \(n_{i+1}\)\(a_{i+1}\) 与一个 \(a_{i+2}\),其可以对应到另一种方案(且这种对应关系一定不成环)。与此同时,不满足这个条件的方案的和一定互不相同。

因此,只需要计算不满足上述条件的方案数,即为答案。

考虑最后的 \(1\),有 \(a_{k-1}=n_k a_k+1\)。若选中 \(1\),如果 \(a_k\) 没有全选,则可以取消选中 \(1\) 而选择一个 \(a_k\);如果 \(a_k\) 已经全选,可以取消选中所有 \(a_k\)\(1\) 改为选中 \(a_{k-1}\),一定可以对应到另一方案。

因此,加上最后的 \(1\) 的方案数 等于 不加 \(1\) 的方案数 加一。

考虑计算方案数,DP 记录上一段与这一段是否全选即可。转移时同时对一整段的 DP 值求和记录答案即可(转移形如常数或一次函数)。

需要特判 \(A=B,B=C,B-A=C-B\) 等情况,总时间复杂度 \(O(T \log V)\)

Code

posted @ 2022-06-01 09:33  苹果蓝17  阅读(381)  评论(0编辑  收藏  举报