Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)
A. Colour the Flag
题意: 给定一个棋盘,一些格子已经染上黑白色,判断能否将剩下的格子染色,使得相邻格子不同色。输出构造。
思路:
考虑一个棋盘的合法染色方案只有两种,分别比较一下即可。
B. Histogram Ugliness
题意: 一个柱状图,权值定义为操作次数加上竖直方向的周长。一次操作可以将一个柱子减一。给定初始柱状图。求最小权值。\(n \le 4 \times 10^5\)。
思路: 这题出题人很良心地在样例解释误导选手。我们不难发现,只有当 \(a_{i - 1} < a_i\) 且 \(a_{i+1} > a_i\) 减少才有意义,所以我们只用将这种的都减少了即可。这题其实就是求相邻两个数的差的绝对值之和。
C. Little Alawn's Puzzle
题意: 有 \(2 \times n\) 的网格,其中数属于 \([1,n]\) 且每个数恰好出现两次且不在同一列,一次交换可以交换同一列的两个数,求有多少种最终状态使得形成两个排列。
思路: 经典套路了,我们不妨在同一列两个点之间连边,不难发现形成了若干个环,每个环恰好有两种定向方式符合条件,所以答案就是 2 的环的个数次幂。
D. Lost Tree
题意: 交互题,有一棵树,每次可以询问一个点,返回所有节点和他的距离。要求在 \(\lceil\frac{n}{2} \rceil\) 次内求出这棵树。
\(n \le 2000\)。
思路:
我们首先注意到,如果一个点与某个点距离为 1,则这个点与其有边。
树上问题,不妨指定一个根,然后我们就得到了深度为 1 的点,这时候我们询问深度为 2 的点就能得到其于深度为 1 的店与深度为 3 的点的所有边。
所以我们发现将树黑白染色后只用询问一种颜色的即可,所以我们选更少的哪个,刚好满足次数限制。
E. Lost Array
题意: 交互题,一个长度为 \(n\) 的数组,每次可以询问 \(k\) 个不同位置的数的异或和,要求在最少的次数内求出整个数组的异或和。\(n \le 500\)。
思路:
一开始读错题了,没看到要求最少次数。
本质就是构造一个方案每个数被选奇数次,进而我们发现,如果知道当前有 \(x\) 个数已经是奇数次了,那么我们枚举下一次询问有几个奇数次的元素就能推出新的状态有几个是奇数次的。
这让我们不妨想到最短路,总共 \(0 \sim n\) 共 \(n + 1\) 个点,边数是 \(O(n^2)\),所以直接跑 bfs 即可。
然后我们只用看 \(n\) 可不可达,如果可达,倒回去找路径即可。
F1. Falling Sand (Easy Version)
题意: 有一个竖着的 \(n \times m\) 的游戏盘,一些格子是沙子。扰动一个沙子会导致这个沙子垂直下落掉出去,并扰动到所以与其任意时刻四相邻的格子中的沙子。现在给定游戏盘,求最少扰动几个沙子可以使得所有沙子都落出去。
\(n \times m \le 4 \times 10^5\)。
思路:
第一个观察是同一连通块的沙子只用一块,而剩下的会构成一个 DAG。
所以我们对每个格子当一个点,然后连向正下方的格子,同时对于每个有沙子的格子我们也连向其四相邻的格子。
于是我们可以用 SCC 缩点变成 DAG,所以我们需要的就是哪些不存在一个沙子可以到达的沙子。拓扑排序统计一下即可。