摘要: 分析 发现每个字符串只会被它的后缀规定,那么就从后往前计算,使得计算每个字符串的时候其后缀已经合法。 因为每一次计算我们都只想删最少的字符,而且删得越少这个字符串的字典序就越大,所以它的前缀的最小字典序就越大,需要删的字符就越少,所以对于每一次计算都只删最少的字符的贪心策略符合全局最优,所以这个贪心 阅读全文
posted @ 2023-10-27 16:15 Kazdale 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 分析 先对每一列都做 DP 寻找极长单调不降区间,能够得到若干极长单调不降区间,只要询问的区间是这些区间的子区间,那么说明在这个区间内必有一列的这个区间是单调不降的。 思考如何快速判断子区间。 用 \(f_{x}\) 表示以 \(x\) 为所有左端点为 \(x\) 的区间的右端点最大值,那么对于询问 阅读全文
posted @ 2023-10-27 15:03 Kazdale 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 分析 思考对于 \(M\) 的每个数而言,贡献是一定的,它最多只能换掉一个数。 那么贪心地能换就换,但是如果换小的可能会导致更小的数换不掉,那么就换能换的最大的,这样不会干扰只能换小数的其他数,能换这个数的可以去换其他数,如果连其他数都换不掉说明这两个数等效,换谁都一样,所以这样换一定是最优的。 如 阅读全文
posted @ 2023-10-27 11:34 Kazdale 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 分析 发现操作 \(6\) 次后就会回到初状态,于是将状态打表,将 \(n\bmod6\) 即可。 代码 #include <iostream> using namespace std; constexpr int MAXN(1000007); int a[6][3] = { {0, 1, 2}, 阅读全文
posted @ 2023-10-27 10:51 Kazdale 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 分析 看到异或不难想到 01Trie。 不难想到,当两个数的点权相等的时候,我们可以当这两个点是一个点,因为连边的费用为 \(0\)。 那么对于一个序列 \(n\),若存在 \(m\) 种不同的权值,那么在 Trie 树上子节点数为 \(2\) 的节点就有 \(m-1\) 个(因为如果一个数新加进来 阅读全文
posted @ 2023-10-27 10:04 Kazdale 阅读(158) 评论(0) 推荐(0) 编辑