2023.8.29 test
ZR2023 NOIP #1
A
有一个长度为 \(n\) 的括号串,你可以交换两个相邻的括号直到括号串合法。求出最小的次数。
考虑把左括号看成 \(1\),右括号看成 \(-1\),然后做前缀和 \(\{sum_i\}\)
交换第 \(i\) 和第 \(i+1\) 位可以使得 \(a_i\leftarrow a_i+2\),其中 \(a_{i-1}=a_{i+1}>a_i\),即交换右,左括号。
考虑用一个桶 \(cnt_i\),每次令最小的 \(i\) 加 \(2\),令 \(cnt_{i+2}\leftarrow cnt_{i}+cnt_{i+2},Ans\leftarrow Ans+cnt_i\) 即可。
B
有一个无限大的平面,最初,机器人在 \((0,0)\) 处. 然后它会顺序执行 \(n(n\le 20)\) 个命令。
每个命令内容是让其上下左右走一格中的一个。
平面内有若干障碍物,机器人不能进入障碍物。若有命令令其走向障碍物,则忽略。
问任意的障碍物位置最后导致的机器人位置有多少种并输出方案。
DFS 即可。
C
黑板上有 \(n\) 个数,每次擦掉两个数并写上其异或的值。
你有一次机会,可以在任意时刻把黑板上的一个数加上 \(1\),问最后那个数的最大值。
首先考虑处理把一个数 \(x\) 加一,若 \(x\) 二进制下有末尾连续 \(i\) 个 \(1\),那么加一就相当于异或上 \(2^{i+1}-1\).
由于如果不加一,异或和是不变的。
考虑枚举 \(i\),再计算异或起来的最大值。判断是否可以有这样的 \(x\).
我们可以用线性基,判断有没有末尾连续 \(i\) 个 \(1\) 可以凑成。
如果我们从低位到高位去建线性基,那么判断就变成了前缀 \(i\) 个 \(1\),直接取线性基的前 \(i\) 位就可以了。
D
仙人掌,每条边有两个权值 \((a,b)\),求最小生成树,权值是 \(\sum a\times \sum b\).
首先考虑仙人掌的性质,就是每个环删一条边就是最小生成树了。
如果我们把 \((\sum a,\sum b)\) 看成一个点,
考虑每个环有哪些点可以做贡献。显然,是一个下凸壳上的点可以做贡献。
如果有两个环呢,那么就是 \((a_1+a_2,b_1+b_2)\),仍然维护一个下凸壳。
这恰好是一个闵可夫斯基和的形式。
多个环就分治合并即可。