CF Diff 训练记录

380C. Sereja and Brackets

如果是考虑整个序列的答案,那么就是计算有多少个 ) 是匹配的。

那么就有一种贪心的做法,在全局的序列上对于每一个 ),找到能够匹配的且最近的 (,记作一个点对。

这样查询只要包括这个点对,那么就是有贡献的,这样就转换为一个数点问题了。

还有其他做法:比如说线段树维护答案还是比较基础的操作的。

sol

5C. Longest Regular Bracket Sequence

可以发现这个括号序列其实被划分为了一个类似于树一样的结构,不过可以不用树的知识来解决。

计算最长的合法的子串,还是按照全局的括号匹配来做,我们在处理的时候需要用对于当前这个下标,在他之前且第一个满足不能让这个序列合法的位置来计算答案。

sol

577B. Modulo Sum

问题就是:是否存在一个可重集合满足和模 m 的余数为 0。

因为 m 的范围较小,所以我们可以记录下每个余数出现的次数,那么问题就被转换为了多重背包了,用二进制拆分的做法就可以过。

sol

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 可以改变奇偶性,所以可以按照格子的奇偶染色来更新。

sol

25D. Roads not only in Berland

做法显然就是考虑用环上的边把若干个连通块连起来。

  • 一个写法就是把所有边判断一下是否在环中,然后把每个连通块看成一个节点,连接起来就可以了。
  • 另外一个写法就是先把不是树的连通块连起来,然后再把每棵树连进来。

sol

61E. Enemy is weak

考虑中间那个 \(a_j\),其实问题就是变成计算两个独立的二维偏序,用树状数组来维护即可。

sol

1359D. Yet Another Yet Another Task

考虑到值域非常的小,所以我们可以枚举最大值,然后删去大于当前枚举的最大数的数,剩下来的数做一遍最大子段和即可。

sol

1370D. Odd-Even Subsequence

考虑二分枚举奇序列和偶序列的最大值,那么这个对应序列的所有值都不能超过这个值,剩下一个序列就是任取即可。

sol

1328E. Tree Queries

可以发现一个性质:

  • 同一个深度 \(d\) 的节点,其父节点一定是同一个,记为 \(x\)

  • 如果深度大于 \(d\),一定是位于这个父节点 \(x\) 的其中一个子树内。

sol

463C. Gargari and Bishops

首先对整个方格黑白染色后,就可以满足两个象不冲突的条件。

那么问题就变成了在两个点集中分别取一个点,然后满足主对角线和副对角线总和最大,因为相互独立,所以分开来计算即可。

sol

posted @ 2023-12-10 15:02  mulberror  阅读(29)  评论(0)    收藏  举报