Codeforces Round 922 (Div. 2)
A. Brick Wall
思路:
- 水平的砖尽可能多,那么直接输出 \(n \times (m \div 2)\) 即可
时间复杂度:\(O(1)\)
1 | void solve() { |
B. Minimize Inversions
思路:
- 两个序列,那么只要其中一个是升序的,那么两者之和一定最少
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
C. XOR-distance
思路:
- 首先,解决本题要了解异或(
xor
)的性质,即:相同位为0
,不同位为1
- 那么要使得本题的 \(|(a \oplus x) - (b \oplus x)|\) 的最小值,那么我们要明确,一定是使得 \((a \oplus x)\) 和 \((b \oplus x)\) 的值尽可能的接近
- 首先我们可以默认 \(a > b\)
,那么我们将 \(a\) 转换为二进制, \(b\) 转换为二进制,然后我们要缩小 \((a \oplus x)\) 和 \((b \oplus x)\) 的差距,那么就需要明确,如果
\(a\) 的二进制表示中的某一位和 \(b\) 的二进制表示的某一位出现了不同,且
\(bita_i > bitb_i\) 那么就需要将
\(a\) 的这一位与 \(b\)
的这一位交换(
sum + 1 << i <= r
的情况下) - 特别注意,如果从高位到低位枚举的第一个不同点出现,且这个位置的 \(bita_i > bitb_i\) ,那么就要略过这一位,因为这一位换了的贡献要大于其他后面低位的所有位的贡献,这是可以证明的
推荐看一下这一篇讲解
时间复杂度:\(O(logn)\)
1 | void solve() { |
D. Blocking Elements
snow
的代码
1 |
|
F. Caterpillar on a Tree
snow
的代码
1 |
|