atcoder ARC 120~160
ARC
这部分的题质量较高。选了一点我能力范围内比较可做的题做了一下。
AtCoder Regular Contest 120
D - Bracket Score 2
AC
首先对于最大的答案,我们认为是前 \(n\) 大的数的和减去后 \(n\) 大的和,显然这样一定是最大的,括号序列的构造方法便是对于一对括号,前后括号的位置一个是前 \(n\) 大一个是前 \(n\) 小,直接用栈求一下即可。
E - 1D Party
AC
纯正的 adhoc + dp。
下面的球就是题目的人。我们首先玩一玩性质,把所有点画到一维位置二维时间的图上,题目就是要让每个 \(a_i\) 和 \(a_{i + 1}\) 相撞。首先我们发现,如果此时要让 \(a_i\) 和 \(a_{i + 1}\) 相撞,相向而行一定是比不动不劣的,手玩一下能够不难理解。那么我们有推论,每个小球每个时刻都动一定是不劣的,那么两个球相撞后就要立即反弹。对于区间 \([l, r]\),其内部所有相邻的求撞一遍的时间最多为 \(\frac {a_r - a_l} 2\),因为我们可以将相撞后反弹看作两个球穿过去了,如下图:
那么答案就是所有这样的段段串起来的最高高度,如下图:
由于我们想时间(最高高度,也就是长度的一半)最短,那么我们就想 \(a_r - a_l\) 最小也就是 \(r - l\) 最小,我们发现当 \(r - l + 1 \in [4, 5]\) 就可以涵盖所有情况,且最头上和最末尾的长度可以为 \(3\),那么就可以 \(O(n)\) 的 dp 了。做完了。
F - Wine Thief
神秘推式子。
Gemini
直接枚举方案再求和复杂度过高,转为计算每个位置 \(A_i\) 在多少个合法方案中被选中(记为 \(T(i, N, K)\))。最终答案即为:
- 拆分组合意义
若 \(i\) 被选中,且 \(i\) 是选出的 \(K\) 个元素中的第 \(j\) 个(\(1 \le j \le K\)):
- 左侧:从 \(i-1\) 个位置中选 \(j-1\) 个不相邻元素,插空法方案数为 \(\binom{i-j}{j-1}\)。
- 右侧:从 \(N-i\) 个位置中选 \(K-j\) 个不相邻元素,插空法方案数为 \(\binom{N-i-(K-j)}{K-j}\)。
枚举 \(j\) 得到卷积形式:
- 递推与组合化简
利用容斥或插空递推关系,将两项组合数的卷积化简为单项交错和。考虑补集转化可得递推关系:
沿递推关系展开,原式可直接化简为交错组合数前缀和:
其中边界上限 \(m = \min(i-1, N-i, K-1)\)。
- 性质与复杂度优化
- 分段常数性:\(T(i, N, K)\) 的值仅由 \(m = \min(i-1, N-i, K-1)\) 决定,关于 \(i\) 在两端递增/递减,在中间保持常数 \(P_{K-1}\)。
- 线性预处理:
- \(O(N)\) 预处理阶乘及逆元。
- \(O(K)\) 递推求出 \(P_0, P_1, \dots, P_{K-1}\) 数组。
- \(O(N)\) 遍历 \(i \in [1, N]\),计算 \(A_i \cdot P_{\min(i-1, N-i, K-1)}\) 并累加。
总时间复杂度:\(O(N)\)
总空间复杂度:\(O(N)\)
NOMURA Programming Contest 2021 (AtCoder Regular Contest 121)
D - 1 or 2
看错题了。/ll
假设全都要抓两个,只需要先排序,然后将每个 \(a_i\) 和 \(a_{n - i + 1}\) 配对即可。然后枚举可以有抓几个一个的,假设有 \(k\) 个,往里面差 \(k\) 个 \(0\) 重复方面做法即可。时间复杂度 \(O(n \log n + n ^ 2)\)。
E - Directed Tree
没想到容斥,神了。
考虑容斥,设 \(dp_{i, j}\) 表示 \(i\) 子树中钦定了 \(j\) 个不合法位置的方案数,那么显然答案为 \(\sum_{j = 0} (-1) ^ j dp_{i, j} (n - j)!\)。现在考虑转移,假如在第 \(x\) 个点,初始状态为 \(dp_{i, 0} = 1\),遍历儿子,假设现在的儿子为 \(to\),那么有类似背包的转移:
遍历完儿子后枚举 \(i\) 是否合法,有:
注意上面的转移需滚动数组。做完了。
F - Logical Operations on Tree
AC
我们手玩一下,我们发现存在一个点其值为 \(1\) 且周围的边全是或边就可以将图缩成一个 \(1\) 点,有与边则不一定。因为若只存在或边就可以将或边对面的连通块先缩成一个点,然后再缩这条或边一定会缩成 \(1\)。存在与边则这条边缩了后的值需要取决于两个端点。那么对于与边,我们若想要缩完之后为 \(1\) 那么两边都应为 \(1\)。那么我们考虑先把与边缩完,然后判断剩下只有或边的图,只要有一个 \(1\) 存在那么就可以缩成一个 \(1\)。既然与边缩完之后存在一个 \(1\),要么有一个 \(1\) 没有任何与边,要么有全是与边的极大连通块中点权全是 \(1\),第一种显然可以被第二种代替因为相当于连通块中只有一个点没有边。那么我们直接对这个条件计数,直接记不好计正难则反,我们考虑对只能缩成 \(0\) 的计数,那么所有的 \(1\) 至少能通过与边和一个 \(0\) 联通。计数直接 dp 是简单的,细节看代码。做完了。
Tokio Marine & Nichido Fire Insurance Programming Contest 2021 (AtCoder Regular Contest 122)
D - XOR Game
AC
由于鲍勃是后手,那么可以对于所有数两两分组,艾丽丝删一组中的一个鲍勃就删另一个,鲍勃就可以控制答案,那么最后的游戏得分一定最小。那么现在就求怎么两两分组使得亦或后答案最小。我们考虑 trie 树上分治,从高位到低位建 01trie。假设分治到的节点为 \(i\) 于第 \(d\) 层,那么其儿子第 \(d\) 位往上都应是相同的,那么其左右儿子就应为第 \(d\) 位为 \(1\) 的和为 \(0\) 的。若两者中元素皆为偶数,那么显然第 \(d\) 位不会有贡献,因为可以在各自子树中两两配对,分治到左右儿子即可。对于两个为奇的,就没有必要递归左右儿子,因必然会出现左子树匹配右子树的情况,此时第 \(d\) 为有贡献所以亦或出来的答案肯定会比儿子的大。那么此时我们就贪心的选两个子树中亦或和最小的两个数做匹配即可,这个也能用同一颗 trie 做。做完了。
AtCoder Regular Contest 124
D - Yet Another Sorting Problem
AC
我们把排列弄成建边,\([1, n]\) 为黑点剩下为白点,那么就相当于给出你一个用黑白点和边弄出来的环,可以交换两个黑白点的边指向的位置,使得最后的图变成一堆自环。对于既有黑点又有白点的环,假设大小为 \(x\),手玩一下容易知道最少 \(x - 1\) 次可以全弄成自环。否则,如果全是白点,那么要找一个全是黑点的环或者一个黑色自环交换一次,那么就可以变成有黑有白的环。那么现在算答案就简单了,设白环有 \(x\) 个黑的有 \(y\) 个,一共有 \(i\) 个环,根据上面的结论不难发现答案为 \(n + m - i + \max(x, y)\)。环可以用并查集维护,做完了。
E - Pass to Next
完全没想到啊。好神秘的做法。
AtCoder Regular Contest 125
D - Unique Subsequence
AC
设 \(dp_i\) 表示以 \(i\) 结尾的答案,由于尽量不重复我们每一个都应从最后一个数字转移,设 \(lst_j\) 表示最后一个 \(i\) 使得 \(a_i = j\),那么有:
答案显然为:
树状数组优化转移即可。做完了。
AtCoder Regular Contest 126
E - Infinite Operations
AC
手玩弄出结论了。
首先可以看出来,最后的数会全部等于平均数。我们假设对于 \(a_i\) 和 \(a_{i + 1}\) 取均值的操作,我们将贡献从 \(x\) 变成 \(2x\) 即 \(a_{i + 1} - a_i\) 方便计算,最后乘上 \(\frac 1 2\) 即可。我们发现,假设 \(u\) 和 \(v\) 合并成两个 \(\frac {u + v} 2\),\(x\) 和 \(y\) 弄成 \(\frac {x + y} 2\),两个的贡献显然分别为 \(u - v\) 和 \(x - y\)。假设 \(x > y > u > v\),这四个再两两分别合并,那么我们发现总代价为 \(u - v + x - y + 2(\frac {x + y} 2 - \frac {u + v} 2) = (u - v) + (x - y) + (x - u) + (x - v) + (y - u) + (y - v)\),那么我们如果要让整体答案最大,不妨认为答案就为 \(\sum_{i < j} |a_i - a_j|\),线段树可以动态维护这个和,乘个 \(\frac 1 2\) 就是答案。做完了。
AtCoder Regular Contest 127
D - Sum of Min of Xor
口圭,分讨。
按位所贡献。将 \((a_i, b_i)\) 第一位为 \(0\) 和 \(1\) 分成 \((0, 1), (0, 0), (1, 0), (1, 1)\) 四类,考虑不同组之间贡献,分讨即可,对于 \(((0, 0), (1, 1))\) 和 \(((0, 1), (1, 0))\) 没有显然解递归到下一位即可。
E - Priority Queue
AC
简单 dp。
限制太少了不好计数,我们规定操作 \(1\) 选数只能从小到大选。我们将一次 \(2\) 操作和最近的一次 \(1\) 操作合起来,合成 \(0\) 操作表示选出一个数丢掉。设 \(dp_{i, j}\) 表示选了前 \(i\) 个数且还欠着 \(j\) 个操作 \(0\)。若 \(p_i = 1\),有转移:
表示这次是取还是删(补前面欠的操作二),注意如果此时 \(j \ne 0\) 那么其实在前面再要删数的时候已经提前取过这次数了,所以可以这么转移。如果此时 \(p_i = 0\),那么枚举现在是删(\(j = 0\) 删这次而 \(j > 0\) 表示补前面欠的,反正所有操作 \(0\) 从左到右执行)有转移:
做完了,答案为 \(dp_{n, 0}\),\(n\) 为操作 \(0\) 和 \(1\) 的总次数,其显然等于 \(a\)。
Daiwa Securities Co. Ltd. Programming Contest 2021 (AtCoder Regular Contest 128)
D - Neq Neq
没有想到去手玩一个区间能删完的条件。
能想到 dp,设 \(dp_i\) 表示前 \(i\) 个球以 \(i\) 结尾(即 \(i\) 不删)的方案数。转移不好做,我们考虑对于区间 \([l, r]\),我们要将其删的只剩 \(l\) 和 \(r\) 的条件。对于 \([l, r]\) 中只有两种颜色,只有类似 aba 的情况能删,因为对于区间内有相邻且相等的情况显然删不了,而若只有两种颜色,不直接出现相等且相邻,那么一定形如 ababababa,当长度不为 \(3\) 时,不管删哪个都没法再删到删完了。对于颜色大于 \(2\),我们发现不论怎么样的区间都能删掉。对于两种颜色的转移,只需判断 \(i\)、\(i - 1\) 和 \(i - 2\) 的颜色情况即可;对于两种以上,不难发现可以转移的区间是一个前缀,求出前缀的右端点是简单的,前缀和优化即可。
E - K Different Values
显然同一种颜色最多 \(\lceil \frac n k \rceil\) 个且最多 \(n \bmod k\) 个这样的元素。构造方案时,对于每一个位置暴力找到第一个合法的数即可。
AtCoder Regular Contest 129
C - Multiple of 7
AC
考虑用 7777a7777b777...77.. 的形式拼起来,那么一段长度为 \(n\) 的 777..77 对答案的贡献就为 \(\frac {n(n + 1)} 2\),那么直接拼即可。但是对于中间的连接的数字 a、b 是不能产生贡献的,一直给他们赋随机值直到合法即可。
D - -1+2-1
想了差分却没有想前缀和。
首先 \(\sum_i a_i\) 不为 \(0\) 肯定不合法。直接看这个操作形式太鬼畜了,考虑往差分和前缀和上转。差分更鬼畜,考虑前缀和。由于 \(\sum_i a_i\) 为 \(0\),那么我们设 \(s_1 = 0\),然后其他 \(s_i - s_{i - 1} = a_{i - 1}\),转化下就可以求出环的前缀和。那么最后所有 \(s_i\) 都应变为 \(\frac {\sum_i s_i} n\),设 \(sum = \frac {\sum_i s_i} n\),若其不为整数显然无解。我们再令 \(s_i \gets s_i - sum\) 就变成所有 \(s_i\) 要变成 \(0\) 了。我们再看在前缀和数组上题目中的操作,就转换为了选一个位置 \(i\) 使得 \(s_i \gets s_i - 1\) 且 \(s_{i + 1} \gets s_{i + 1} + 1\),相当于将换上的数字向左移动,此时求答案是简单的,做完了。
AtCoder Regular Contest 130
D - Zigzag Tree
AC
典完了。
设 \(dp_{i, j, 0/1}\) 表示 \(i\) 于 \(i\) 子树中排名为 \(j\) 且小于或大于全部儿子的方案数,转移类似背包 / 卷积。做完了。
E - Increasing Minimum
AC
我们把操作序列划分成一段一段的集合,假设分别为 \(s_1, s_2, \cdots, s_m\),\(s_i\) 集合表式集合元素会在成为第 \(i\) 个最小值并被集体加 \(1\)。那么不难发现,对于最后一个集合我们可以钦定为 \({1, 2, \cdots, n}\) 但不用完整出现于操作序列末尾,因为最后有的值没有加也是合法的。对于其他,显然有 \(s_i \subset s_{i + 1}\),且在操作序列上划分的段中没有重复元素。由于要求字典序最小,那么个集合都尽量大,即划分的序列都尽量长。
考虑 dp,设 \(i\) 开头能划分的合法段最长为 \([i, dp_i)\),即 \(dp_i\) 要尽量大,后面到 \(k\) 都能被划分为合法段。首先我们考虑 \(dp_i\) 的范围 \([l, r]\),对于下届 \(l\),我们知道 \([i, dp_i)\) 应包含所有 \([1, i)\) 中出现的数以对应集合 \(s_i \subset s_{i + 1}\) 的限制,设 \(nxt_i\) 表示下一个 \(a_i\) 所在位置,那么 \(l = \max_{j = 1} ^ {i - 1} nxt_j + 1\),可以用前缀和优化到 \(O(1)\) 查,对于 \(r\),显然有 \(\forall k \in [i, r)\) 满足 \(nxt_k \ge r\),可以二分。
考虑转移,我们现在倒序枚举 \(i\),若 \([i, k]\) 中没有重复元素,那么其可以做为集合 \(s_m\) 在序列上不完整的划分段,前文说过 \(s_m\) 是可以不完整的,特殊的令 \(dp_i \gets i\)。对于转移,\(dp_i\) 应该为最大的 \(k \in [l, r]\) 满足 \(dp_k \ne 0\)(不为 \(0\) 是为了保证合法)。由于我们是倒叙枚举的 \(i\),那么我们只需将 \(r\) 初值赋为 \(k\),且到了 \(i\) 就令 \(r = \min(r, nxt_i)\),然后让 \(r\) 一直减知道 \(l > r\) 或者 \(dp_r \ne 0\),这样我们就可以线性的进行转移。
现在我们求出了所有 \(dp\) 值,如果 \(dp_1 = 0\) 显然无解,否则我们就能利用 \(dp\) 求出所有的段的划分,维护 \(add_i\) 表示 \(i\) 在除了 \(s_m\) 中的多少个集合出现过,即除了最后一次加加了多少次,设 \(mx = \max_{i = 1} ^ n add_i\),那么为了字典序最小,\(i\) 的值就应为 \(mx + 1 - add_i\),这个感性理解是容易的。
做完了,时间复杂度线性。
F - Replace by Average
想出了做法但用 AI 调了代码且比较多。
容易想出答案是个下凸壳,证明是容易的。那么我们直接求凸包即可,由于这里所有 \(a_i\) 都要为整数,那么斜率也要为整数,建凸包比较时取 \(\lceil k \rceil\) 即可。那么我们选择凸包上的相邻两个点 \(u\) 和 \(v\),我们要求 \(i \in (u, v)\) 的 \(a_i\),直接通过 \(a_u\) 累加斜率即可,前半段加 \(\lfloor k \rfloor\) 后半段加 \(\lceil k \rceil\)。做完了。
AtCoder Regular Contest 131
E - Christmas Wreath
AC
不难的构造。
对于任意点 \(u\),我们将所有 \(u \rightarrow v\) 且 \(u < v\) 的边全部染成一种颜色。这样显然能满足条件 2。接下来满足条件 1,设 \(m = \frac {n(n - 1)} 2 \times \frac 1 3\),那么三种颜色的边都应有 \(m\) 条,整除不了直接无解。分配颜色考虑 dp,设 \(dp_{i, j, k}\) 表示三种颜色分别有 \(i\)、\(j\)、\(k\) 条能否被构造出,从小到大枚举 \(i\) 即上面的 \(u\) 暴力转移即可,记一个 dp 溯源,并且值得注意的是 \(i\) 一定那么 \(i + j + k\) 也一定,所以只用开三维。做完了。
AtCoder Regular Contest 132
E - Paw
为什么不去手玩最终的序列???
手玩一下,发现序列最终只会变成 <<<<<<????>>>>> 情况,表示左边都是向左,右边都是向右,中间恰有一个间隔不变。考虑 \(n\) 个点都变成 < 且不影响到最右边的概率为 \(dp_i\),显然有转移:
枚举最后剩的间隔,对答案的贡献有:
做完了。
AtCoder Regular Contest 134
D - Concatenate Subsequences
AC
时间不够不想手写分讨。
贪心分讨做完了,没什么难度。
AtCoder Regular Contest 136
D - Without Carry
AC
由题知 \((i, j)\) 相加每一位都不能进位,那么我们设 \(x\) 表示 \(x + a_i\) 相加不会进位的最大整数,那么所有能匹配的 \((j, i)\) 都有 \(a_j\) 每一位小于等于 \(x\),把每一位拆开,加上 \(i < j\) 的限制是一个 7 维偏序,那么可以用 7 维数点,使用 6 维树状数组暴力解决。做完了。
E - Non-coprime DAG
AC
我的天啊打表大人!
我们打出表来,暴力 dfs 暴力建边判断是否联通,打个 \(30\) 就够了。我们发现对于 \(i\),假设其最小质数为 \(p\),其与 \([i - p + 1, i + p - 1]\) 以内的数一定不可达。那么其实就做完了,我们发现只能存在一个偶数,那么枚举偶数,假设枚举到 \(x\),那么对于所有 \(x \in [i - p + 1, i + p - 1]\) 的奇数都是可以选的,用差分可以求到和,为了图方便代码写的 BIT。做完了,别忘记任何时候都可以选 \(1\)。
AtCoder Regular Contest 137
C - Distinct Numbers
AC
我的天呐打表手玩大人。
我们把题目原来的每个 \(a_i\) 都放上球,我们将所有 \([0, a_n]\) 且原本没有球的位置称为待删点,每次将最远的球移动到前面,新的最远的球和移动之前最远的球之间的待删点便被删了。那么带删点如果已经被删完了显然必败,那么有偶数个待删点显然必败,应为后手可以跟随。但是注意 Alice 如果先操作,且 \(a_n > a_{n - 1}\) 那么第一次可以使得 Bob 操作时一定有偶数个待删点,此时 Alice 必胜,否则直接判断待删点奇偶性即可。
D - Prefix XORs
AC
我的天哪打表手玩大人?!!。
我们对于 \(n\) 和 \(m\) 皆为 \(8\) 时的贡献打出表来:
-0: 1 1 1 1 1 1 1 1
-1: 1 0 1 0 1 0 1 0
-2: 1 1 0 0 1 1 0 0
-3: 1 0 0 0 1 0 0 0
-4: 1 1 1 1 0 0 0 0
-5: 1 0 1 0 0 0 0 0
-6: 1 1 0 0 0 0 0 0
-7: 1 0 0 0 0 0 0 0
前面的 -i 表示 \(n - i\) 的贡献,第 \(i\) 行第 \(j\) 个数表示 \(n - i\) 对求了 \(j\) 次的贡献。直观的发现可以将每一个分成 3 各三角形部分分治去算,但这样是 \(3 ^ {\log_2 n}\) T 飞起来。我们不难注意到,若 \(n - i\) 对第 \(j\) 次有贡献,那么 \(i \And j = 0\),相当于补集的子集,高维亦或前缀和即可做到 \(O(n \log n)\)。做完了。
Daiwa Securities Co. Ltd. Programming Contest 2022 Spring (AtCoder Regular Contest 138)
D - Differ by K bits
想出来了 90 %。
首先判断无解,我们把所有含 \(k\) 个 \(1\) 的数字插到线性基里面,最后如果线性基能被插满那么有解,否则无解。剩下的就是一个一个构造了,对于 \(k = 1\),我们手玩到 \(8\),得到答案序列的差分:
0 0 0 0 1 0 0 0
0 0 1 0 0 0 1 0
0 1 0 1 0 1 0 1
从下往上是二进制位从低到高。我们不难发现每一位的差分即 \(a_{i - 1} \oplus a_i\) 等于 \(\operatorname{lowbit}(i)\),那么我们就知道 \(k = 1\) 的构造了。对于 \(k > 1\) 时,我们将每个数转换为线性基中的数相异或,从低到高每一位表示是否被线性基从低到高的这一位异或,我们发现这样显示变成了 \(k = 1\) 的情况,类似的做即可。做完了。
AtCoder Regular Contest 139
D - Priority Queue 2
AC
调了有点久 /ruo
首先我们不难注意到删除的数就是将 \(a\) 和所有加入的数合起来排序后第 \(x\) 小到第 \(x + k\) 小的数。正难则反,我们考虑先算出来所有数的总和,再减去第 \(x\) 到第 \(x + k\) 小的数的贡献。首先对于总和,不难发现有:
现在考虑算 \([x, x + k]\) 的贡献,我们拆贡献,设 \(f_i\) 表示 \([x, x + k]\) 中大于等于 \(i\) 的数的总个数,那么这一块的总贡献显然为 \(\sum f_i\),现在考虑怎么算 \(f_j\) 即可。考虑枚举 \(j\) 表示添加了多少个小于 \(i\) 的数,那么有贡献,我们设区间 \([l, r] \subset [x, x + k]\) 表示大于等于 \(i\) 且要被删,设 \(cnt_i\) 表示 \(a\) 中小于 \(i\) 的数的个数,那么显然 \(r = x + k - 1\) 且 \(l = \max(x - 1, cnt_i + j) + 1\),当 \(l > r\) 时显然没有贡献,否则有:
做完了。
AtCoder Regular Contest 140
D - One to One
AC
小清新数数。
我们发现图中不管怎么连都一定会形成一个基环树森林,那么我们只要对环计数即可。首先对于已经确定的环,假如有 \(cnt\) 个,我们假设有 \(tot\) 个 \(a_i\) 为 \(-1\),那么这一部分显然有贡献:
现在考虑新形成的环。我们发现图中还有一些确定的树,设其根为 \(i\),大小为 \(siz_i\),显然其若不是基环树那么显然 \(a_i = -1\),我们不妨将其所缩成入度为 \(siz_i\) 出度为 \(1\) 的点。现在我们考虑确定了换的元素来计算其贡献,假设环的点集为 \(s\),假设大小为 \(k\),那么贡献就为:
那么我们固定换的大小为 \(k\),那么不同的就只是 \(\prod_{i \in s} siz_i\),我们设 \(dp_i\) 表示任意 \(i\) 个数的 \(siz\) 之积之和,那么答案就变成了:
\(dp\) 可以 \(n ^ 2\) 地用背包求。做完了。
D - One to One
https://www.luogu.com.cn/article/e0uor7tx
AtCoder Regular Contest 141
D - Non-divisible Set
👍
我们将所有数表示为 \(x \times 2 ^ k\) 且 \(x\) 为奇数,那么 \(x\) 应有 \(m\) 个,由于要选 \(m\) 个数,那么每个 \(m\) 要且仅要选一个 \(k\),我们设 \(L_x\) 和 \(R_x\) 表示每个 \(x\) 能够合法的最小 \(k\) 和最大 \(k\),我们先预处理出所有 \(x\) 的 \(k\) 集合,然后去找最小的 \(k\),使得 \(\forall i \mid j \land k > L_j\),可以递推加二分,\(R_x\) 的求法也是类似的。注意如果有的 \(x\) 的合法 \(k\) 集合为空显然不合法,要判断一下。最后输出答案,就把 \(a_i\) 的 \(k\) 算一下和 \([L_x, R_x]\) 的关系即可。做完了。
E - Sliding Edge on Torus
就差最后一步。
首先转换一下坐标,容易把题目每次操作改成:
给定 \(i\) 和 \(j\),对于 \(\forall y\),将 \((i, y)\) 向 \((j, (y + k) \bmod n)\) 连边。
如果说 \(i\) 和 \(j\) 两列从来没有连过边,那么可以使用带权并查集简单的维护。那么对于 \(i\) 和 \(j\) 连过边,设其并查集的最上面的祖先为 \(x\),将 \(k\) 的权值转换一下可以转化成 \((x, y)\) 向 \((x, (y + k) \bmod n)\) 连边。我们注意到这个玩意应该和 gcd 是有关的,那么设 \(f_x\) 表示 \(n\) 和 \(x\) 连通块中所有 \(k\) 的 gcd,我们手画一下不难发现这个联通块能对总连通块造成 \(f_x\) 个贡献。剩下的部分显然都是简单的。做完了。
AtCoder Regular Contest 143
D - Bridges
AC
我们考虑将原图弄成分层图,分为上点和下点,考虑对于一个连通分量,我们从一个点出发深搜,假如要从 \(u\) 连到 \(v\),那么就将 \(u\) 的下点和 \(v\) 的上点连边,重复的点不经过。显然这样子连边最少,因为不难发现这样子连边不会造成若 \(x\) 在一个边双中上下点之间的连边是桥的情况,如果 \(x\) 自己就是一个一个点的边双那么这样不论怎样都无法避免上下点之间的连边是桥,所以这样构造是对的。做完了。
E - Reversi
好难。
我们考虑从叶子到根进行考虑。对于叶子,我们发现若其为白,那么其应先于其父亲被删掉,否则应晚于父亲。于是我们把先于父亲删掉的叶子对父亲颜色的贡献算一下,相当于其父亲变成了一个新的叶子,继续往上算即可。注意算到最后时,若根的颜色为黑色则无解,否则我们将每个点先于父亲删或后于父亲删的限制改成连边,跑拓扑排序即可。
AtCoder Regular Contest 146
C - Even XOR
你吗的看错题了想了一下午。/fn
设 \(dp_i\) 表示大小为 \(i\) 的方案数,我们发现若出现两个奇数大小的子集亦或和相等就会不合法,当 \(i > n + 1\) 时,一定会有大于 \(2 ^ n\) 个奇子集,由于其取值只有 \(2 ^ n\) 种那么一定会有两个重复的,所以 \(i\) 一定小于等于 \(n + 1\),是 \(O(n)\) 级别的。我们考虑算 \(dp_i\),显然有初始状态 \(dp_0 = 1\) 和 \(dp_1 = 2 ^ n\),答案有 \(\sum_i dp_i\)。我们考虑转移,考虑从 \(i - 1\) 个数加一个数,考虑上面的性质,\(i - 1\) 个数应有 \(2 ^ {i - 2}\) 个值互不相同的奇子集,那么可以选的数就有 \(2 ^ n - 2 ^ {i - 2}\) 个,即只要值不和前面的奇子集相同即可。但直接这样显然会重复,应乘上一个 \(\frac 1 i\)。总结一下,转移为:
做完了。
D - >=<
摩洛哥城堡。
将限制改为 \(A_{p_i} \le X_i \land A_{Q_i} \le Y_i\) 和 \(A_{p_i} \ge X_i \land A_{Q_i} \ge Y_i\) 跑 2-sat。
AtCoder Regular Contest 147
D - Sets Scores
AC
我们考虑转期望,我们先算出每个点的期望长度,然后乘起来再乘以总方案数即可。考虑算总方案数,不难发现每次 \(i \rightarrow i + 1\) 就是改变了一个数的状态,初始状态有 \(2 ^ m\) 种,那么总方案数就有 \(2 ^ m m ^ {n - 1}\) 种。不难发现期望长度为 \(\frac n 2\),显然有答案:
做完了。
E - Examination
AC
如果说 \(a\) 和 \(b\) 分别排序之后 \(A_i < B_i\) 显然无解,否则贪心大分讨即可,用堆维护。
AtCoder Regular Contest 148
D - mod M Game
AC
显然可以将数字两两配对,可以先将所有相等的数配对。剩下一堆不相等的数,假设能配对成 \(cnt\) 对差为 \(\frac m 2\) 的且能配对完就有解,否则无解。做完了。
E - ≥ K
AC
顺序不重要先把 \(a\) 排序,我们对于 \(a_i\),设 \(b_i\) 表示最小的 \(b_i \in a\) 使得 \(b_i + a_i \ge k\),如果 \(b_i > a_i\),假设有 \(c\) 个数和 \(a_i\) 就把 \((c, a_i)\) 挂到 \(a_i\)。现在来计数,从大到小枚举 \(a_i\) 且 \(a_i \ge b_i\),设 \(a_i = v\) 且在原序列中有 \(c\) 假设序列中插了 \(cnt\) 个数大于 \(v\) 且插了 \(sum\) 个 \(b_i > a_i\),那么每个 \(v\) 的左右两侧的数都应该大于等于 \(v\),即插到 \(cnt\) 数的空里面,显然应有 \(cnt + 1 - sum\) 个空,由于 \(c\) 个 \(v\) 之间可以相邻,有方案数 \(\binom {cnt + 1 - sum + c - 1} {c}\)。现在考虑挂在 \(v\) 上的 \((c, j)\) 的贡献,其只能两边的数都大于等于 \(v\),那么就是不相邻的插在剩下的空里面,由于有 \(cnt + 1 - sum\) 个有方案数 \(\binom {cnt + 1 - sum} {c}\)。把所有方案数乘起来就是答案。做完了。
AtCoder Regular Contest 149
D - Simultaneous Sugoroku
AC
显然考虑平衡树,写个平衡树有交合并即可。做完了。
E - Sliding Window Sort
太难了,计数部分不会啊,虽然前面都玩出来了,可能是不对胃口吧。qwq
https://www.luogu.com.cn/article/7rb5vtyx
AtCoder Regular Contest 150
D - Removing Gacha
nb 期望题。
设 \(E(i)\) 表示 \(i\) 被选中的期望次数,答案显然为 \(\sum_i E(i)\)。考虑计算 \(E(i)\),设 \(i\) 深度为 \(dep_i\) 简记为 \(d\),由于除了 \(1\) 到 \(i\) 路径上的点被选了对 \(i\) 没有影响,只考虑 \(1 \rightarrow i\) 的贡献。
假设已经有 \(k\) 个点被抽,那么抽到抽过的点概率显然为 \(\frac k {d}\),抽到没抽到的就应为 \(\frac {d - k} {d}\),期望次数就应为 \(\frac d {d - k}\)。那么把所有点抽了的期望次数就为 \(\sum_{k = 0} ^ {d - 1} \frac d {d - k} = d \sum_{k = 0} ^ {d - 1} \frac 1 {d - k} = d \sum_{k = 1} ^ d \frac 1 k\),每次抽到 \(i\) 的概率显然为 \(\frac 1 d\),那么抽到 \(i\) 的期望次数应为:
把所有点的贡献加起来即可。做完了。
E - Keep Being Substring
AC
还是数据结构好做。
我们观察一下样例,发现对于 \(x\) 和 \(y\) 如果有公共子串,设最长的为 \(s\),把 \(x\) 删成 \(s\),然后再一个一个加成 \(y\),有答案 \(|x| + |y| - 2|s|\),用 sam 做是简单的。对于没有公共子串,那一定是把 \(x\) 删的只剩一个,然后一直加一个删一个直到 \(y\) 包含这个字符,那么将 \(a_i\) 对 \(a_{i + 1}\) 建边,然后跑 bfs 即可。做完了。
AtCoder Regular Contest 152
E - Xor Annihilation
神了。
首先能够发现所有数亦或和为 \(0\),设前缀亦或和(包括 \(Z\))为 \(p_{i - 1}\),那么后缀就应为 \(p_{i - 1} \oplus s \oplus x = p_i\)。然后我们就可以把操作换成若 \(p_i > p_{i + 1}\) 或者 \(p_i > p_{i - 1}\) 就将 \(p_i\) 删掉。我们注意到最后会删的只剩 \(p_{\min}\),不难发现 \(p_{\min} \ge Z\) 就全部静止,转换一下就是要 \(\forall i \land p_{i}\ge Z\),我们不妨算出 \(Z = 0\) 时的 \(p\),那么合法的 \(Z\) 就应有 \(\forall i \land Z \le (Z \oplus p_i)\),那么对于每一个 \(i\),设 \(p_i\) 最高位为第 \(t\) 位,那么 \(Z\) 的第 \(t\) 位一定为 \(0\),其他的位怎么选都合法。设一共有 \(c\) 个没有被限制的为,那么显然有答案 \(2 ^ c\)。做完了。
AtCoder Regular Contest 153
C - ± Increasing Sequence
AC
简单构造。
全部要递增很烦,我们注意到 \(x\) 的差分数组 \(d\) 中,除了 \(d_1\) 可正可负可为 \(0\),后面的全都要大于 \(0\),这个限制更宽一点考虑构造 \(d\)。我们发现 \(d_i\) 对和的贡献应为 \(d_i \sum_{j = i} ^ n a_j\) 即 \(a\) 的后缀和,分讨一下就可简单的构造出来。为了构造更简单,设一个 \(\sum_{j = x} ^ n a_j = 1\) 即贡献为 \(1\) 的 \(x\) 和贡献为 \(-1\) 的 \(y\),我们只需要将所有 \(d_i\) 弄一个默认的 \(1\),然后考虑修改 \(d_1\) 和 \(d_x\) 和 \(d_y\) 将和调整为 \(0\) 即可。只需要考虑贡献为 \(1\) 和 \(-1\) 是因为,由于 \(a_i \in \{-1, 1\}\),所以只要存在贡献为负的就一定有贡献为 \(-1\) 的(因为差分一定为 \(1\) 或 \(-1\)),\(1\) 同理,反之也成立,而为 \(1\) 和 \(-1\) 可以整除所有数比较好操作。做完了。
D - A + B > C ?
AC
好玩的构造。
首先用计算器算一下次数大概是 \(n \log n + n\)。首先我们注意到,当我们确定了 \(p_{pos} = 1\),由于是个排列没有相同的数,那么 \(p_i + 1 > p_j\) 和 \(p_i > p_j\) 是等价的,相当于确定了一个 \(p_{pos} = 1\) 我们就可以确定任意两个数的大小关系,一次排序就可以解决了。现在考虑算 \(pos\),由于 \(1 + 1 \le \forall i \in [2, n]\),那么我们只需要给 \(pos\) 弄一个默认的 \(1\),然后每次问是否有 \(p_{pos} + p_{pos} > p_i\),不成立就 \(pos \gets i\),最后的 \(pos\) 一定有 \(p_{pos} = 1\)。做完了,注意 sort 可能会被卡要用 stable_sort。



浙公网安备 33010602011771号