Codeforces Round #812 (Div. 2)
被交互提薄纱
A
显然答案就是经过最边缘的四个点组成的矩形的周长。
B
显然 \(f(a)_{\min} = \max\limits_{i=1}^n a_i\)。考虑达到这个下界的时候,数组的最小值一定在两端点,删去这个最小值,剩下的数组的最小值仍然一定在两端点。直接模拟就行。
C
每次找到最小的且 \(\ge n - 1\) 的完全平方数,记为 \(sq\),填上所有 \(i \in [sq - n + 1,n - 1]\) 的数,然后再递归。可以证明这种构造方法是正确的,并且原问题一定有解。
D
赛时一直在想六个人分一组,然后就寄了……
四个人分一组,考虑如何通过 一次询问 排除两个人。根据锦标赛的性质,四个人分一组,每组内第一个和第二个人一定有一个人胜局数量是 \(0\),第三个和第四个人一定有一个人是 \(0\),且若有出现次数 \(> 1\) 的数则 一定是 \(0\) 。记组内的四个人分别为 \(b_1,b_2,b_3,b_4\),且每个人胜局数量的数组为 \(a\),那么我们每次询问 \(b_1\) 和 \(b_3\):
- 若 \(b_1 > b_3\),可以发现 \(a_{b_2}\) 一定是 \(0\),此时可以排除掉 \(b_2,b_3\)。
- 若 \(b_1 = b_3\),那么 \(b_1 = b_3 = 0\),此时可以排除掉 \(b_1,b_3\)。
- 若 \(b_1 < b_3\),可以发现 \(a_{b_4}\) 一定是 \(0\),此时可以排除掉 \(b_1,b_4\)。
这样就以总询问次数为 \(2^{n-1}\) 的方法解决了这道题,爆踩标算。
E
显然最终目标是让 \(a_{1,1}\) 尽量小,在 \(a_{1,1}\) 尽量小的前提下,贪心地使 \(a_{1,2}\) 尽量小,以此类推。
题中的操作不会改变对角线上的数,于是只用考虑非对角线上的数。
对于 \(i,j\ (i < j)\),可以发现能使 \(a_{i,j}\) 与 \(a_{j,i}\) 交换的 \(k\) 只有 \(k=i\) 或 \(k=j\)。考虑用 扩展域并查集 维护每个 \(k\) 是否执行操作,\(i\) 为不执行,\(i+n\) 为执行。那么每次枚举 \(i,j\):
- 若 \(a_{i,j} < a_{j,i}\),则最理想的情况就是 \(a_{i,j}\) 与 \(a_{j,i}\) 不交换或交换两次,即并查集中 \(i+n\) 和 \(j\) 当前不在同一连通块内 。如果是这样,则不交换,然后合并 \(i,j\) 且合并 \(i+n,j+n\);否则说明要使前面的字典序达到最小就必须交换 \(a_{i,j}\) 和 \(a_{j,i}\),此时就交换。
- 若 \(a_{i,j} > a_{j,i}\),则最理想的状况就是 \(a_{i,j}\) 与 \(a_{j,i}\) 交换一次,即并查集中 \(i\) 和 \(j\) 当前不在同一连通块内。如果是这样,则交换,然后合并 \(i,j+n\) 且合并 \(i+n,j\)。
枚举完就达到了使 \(a\) 字典序最小的目标。