CF Diff 训练记录
380C. Sereja and Brackets
如果是考虑整个序列的答案,那么就是计算有多少个 ) 是匹配的。
那么就有一种贪心的做法,在全局的序列上对于每一个 ),找到能够匹配的且最近的 (,记作一个点对。
这样查询只要包括这个点对,那么就是有贡献的,这样就转换为一个数点问题了。
还有其他做法:比如说线段树维护答案还是比较基础的操作的。
5C. Longest Regular Bracket Sequence
可以发现这个括号序列其实被划分为了一个类似于树一样的结构,不过可以不用树的知识来解决。
计算最长的合法的子串,还是按照全局的括号匹配来做,我们在处理的时候需要用对于当前这个下标,在他之前且第一个满足不能让这个序列合法的位置来计算答案。
577B. Modulo Sum
问题就是:是否存在一个可重集合满足和模 m 的余数为 0。
因为 m 的范围较小,所以我们可以记录下每个余数出现的次数,那么问题就被转换为了多重背包了,用二进制拆分的做法就可以过。
1438C. Engineer Artem
一眼应该是用种类并查集来维护这个 +0 和 +1 的逻辑情况,只需要维护必定的关系即可,令 \(a[t][v]\) 为与 \(a[x][y]\) 相邻的格子。
- \(a[x][y] = a[t][v]\),那么一定是一个 +1,一个 +0。
- \(a[x][y] + 1 = a[t][v]\) 或者 \(a[x][y] = a[t][v] + 1\),那么一定是同时 +1 或者同时 +0。
不过是有更加简单的做法的,因为 +0 和 +1 可以改变奇偶性,所以可以按照格子的奇偶染色来更新。
25D. Roads not only in Berland
做法显然就是考虑用环上的边把若干个连通块连起来。
- 一个写法就是把所有边判断一下是否在环中,然后把每个连通块看成一个节点,连接起来就可以了。
- 另外一个写法就是先把不是树的连通块连起来,然后再把每棵树连进来。
61E. Enemy is weak
考虑中间那个 \(a_j\),其实问题就是变成计算两个独立的二维偏序,用树状数组来维护即可。
1359D. Yet Another Yet Another Task
考虑到值域非常的小,所以我们可以枚举最大值,然后删去大于当前枚举的最大数的数,剩下来的数做一遍最大子段和即可。
1370D. Odd-Even Subsequence
考虑二分枚举奇序列和偶序列的最大值,那么这个对应序列的所有值都不能超过这个值,剩下一个序列就是任取即可。
1328E. Tree Queries
可以发现一个性质:
-
同一个深度 \(d\) 的节点,其父节点一定是同一个,记为 \(x\)。
-
如果深度大于 \(d\),一定是位于这个父节点 \(x\) 的其中一个子树内。
463C. Gargari and Bishops
首先对整个方格黑白染色后,就可以满足两个象不冲突的条件。
那么问题就变成了在两个点集中分别取一个点,然后满足主对角线和副对角线总和最大,因为相互独立,所以分开来计算即可。

浙公网安备 33010602011771号