Div.2 Round 882 总结
这一场整体下来感觉难度适中,对位运算性质的考查较多,个人感觉 A、B、C 比较简单。
A 「The Man who became a God」
我们不妨假设起初所有村庄都是一个整体,那么 suspicion
的值就是所有相邻村庄的怀疑值差值的绝对值总和,Kars 对村庄进行
\(k - 1\) 次分割将其划分为 \(k\) 个部分,假设分割村庄 \((i, i + 1)\) ,那 suspicion
就在原来的基础上减去一个 \(|a_i - a_{i
+1}|\) ,要得到最小的 suspicion
,换言之我们只需要找到最大的 \(k - 1\)
个相邻元素差值的绝对值即可。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(n)\)
1 |
|
B 「Hamon Odyssey」
注意到,对于正整数 \(x\)、\(y\) 而言,一定有 \(x + y \geq x\ \&\ y\),\((x, y) = (0, 0)\) 时取等,因此如果合并后的有两个相邻的数不全为 0,则可以继续合并使结果严格减小。
综上所述,我们可以得到:
- 若所有数的数位与不为 0,那将所有数字合并为一个整体一定最小,且只能将所有数合并为一个整体时取最小值。
- 若所有数的数位与为 0,则考虑将数组分割为尽可能多的片段,每个片段的所有数的数位与为 0。
时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)
1 |
|
C 「Vampiric Powers, anyone?」
不难证明每一次操作得到的数都是某段连续序列的异或值。因此本题只需要找到最大的连续异或值即可。暴力求解显然会超时,所以最开始我想的是怎么用 DP,后面发现 \((0 \leq a_i < 2 ^ 8)\),也就是说所有数字只有 256 种取值,因此我们使用一个哈希表维护前缀异或即可。
时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)
1 |
|
D 「Professor Higashikata」
贪心策略,我们假设 \(f(i)\) 表示 \(t(s)[i]\) 对应原字符串的下标,那么最右策略就是最大化 \(k\) 使得 \(s_{f(0)} = 1、s_{f(1)} = 1, ..., s_{f(k)} = 1\)。事实上,若存在 \(i\) 和 \(j\) 满足 \(f(i) = f(j) \ (i < j)\) ,则可以不考虑 \(f(j)\) ,因为 \(s_{f(i)}\) 和 \(s_{f(j)}\) 是一样的,且下标 \(i\) 更靠前,若 \(s_{f(i)} = 1\) 则必然有 \(s_{f(j)} = 1\) ,所以我们只要求每个下标第一次出现的时间顺序即可,然后将其按照从早到晚进行排序,以题目的第二个输入为例:
1 |
|
根据题目依次输入的区间,每个下标的出现时间顺序为
5, 6, 2, 3, 7, 8
。
假设原字符串为 \(str\),接下来我们只需要最大化 \(pat = [str[5]、str[6]、str[2]、str[3]、str[7]、str[8]]\) 的字典序,即最大化其前缀 1 的数量,其初始状态为 100010,第一次翻转了下标为 3 的字符,\(str\) 更新为 10111010,\(pat\) 更新为 100110,只需要分别将 \(str[1]\)、\(str[4]\) 和 \(str[6]\)、\(str[2]\) 交换位置即可使得 \(pat\) 字典序最大,共需要两次操作,不难发现,每次的最小操作数量都等于 \(pat\) 在 区间 \([1, min\{num\_of\_ones,\ pat.size\}]\)(\(num\_of\_ones\) 表示 \(str\) 中有多少个 1)中 0 的个数。
综上所述,完成本题需要两个步骤:
- 求出每个字符串下标的出现次序。
- 根据出现次序构造新字符串 \(pat\),每一轮更新后区间 \([1, min\{num\_of\_ones, pat.size\}]\) 中 0 的个数即最小操作数。这一步涉及单点修改和区间查询,可以考虑使用线段树。
时间复杂度:\(O((n + m + q)logn)\)
空间复杂度:\(O(n + m)\)
1 |
|