解题报告【Codeforces Global Round 21】
Codeforces Global Round 21
A
赛时没看题,观察发现是 \(z\) 按位或上任意 \(a_i\) 的最大值。
B
首先可以将整个序列操作两次,即答案最多为 \(2\),其次若只有一段非 \(0\) 段则答案为 \(1\)。
C
模拟,将两个序列里的数都分解完再对比即可。
D
首先发现不可能往回走,若 \(a_i \to a_k \to a_j ~ (i < j < k)\),那么 \(a_j\) 既不是三者的最大值也不是最小值,显然没有 \(a_i\) 和 \(a_k\) 优。
定义 \(f[i]\) 为到 \(i\) 的最短步数,考虑状态转移,先找出在 \(i\) 前比 \(a_i\) 大的第一个数 \(j\) 和比 a_i 小的第一个数 \(k\),在 \((j, i]\) 之中 \(i\) 是最大的,那么 \(i\) 可以作为区间的最大值,向前满足单调递减的下标都可以与 \(i\) 组成区间,\(i\) 作为最小值同理。
发现这些东西维护单调和最值可以用两个单调栈维护,转移可以用线段树维护,时间复杂度 \(\mathcal O(n \log n)\)。
似乎有一个线性做法,先咕了。
E
放在 E 是搞笑的?
观察一下就能发现到达 \((i, j)\) 的 doll 数为 \(\binom {i + j} j\),即为点的权值。
要算所有点的权值和可以枚举每一行,发现一行的权值和即为 \(\binom {i + a_i + 1} {i + 1}\)。
F
啊,这个 F 啊,我无话可说啊。
看起来直接构造,比较难,但是
cmll02:做法不都写在题面上了吗?
考虑如果有解,那么一棵树的所有相邻的边 \((i, k), (j, k)\) 在数据中一定是 \(1\)。
那么考虑将所有 \((i, k), (j, k)\) 为 \(1\) 的两条边并成一个联通块缩起来。
如果有解,必然存在一个连通块大小是 \(n - 1\)(不含多余的边),且里面的边符合题目给定的限制且能构成一棵树。
暴力判一判就过了?
我的评价是,好怪啊???