题目归档 #6
目录及链接
[SCOI 2016] 背单词
首先这是一道语文题(233)
翻译题目后,我们可以知道有如下的题意:
- 给你 \(n\) 个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串 \(s\) 的位置为 \(x\)):
- 排在 \(s\) 后面的字符串有 \(s\) 的后缀,则代价为 \(n^2\);
- 排在 \(s\) 前面的字符串有 \(s\) 的后缀,且没有排在 \(s\) 后面的 \(s\) 的后缀,则代价为 \(x-y\)(\(y\) 为最后一个与 \(s\) 不相等的后缀的位置);
- \(s\) 没有后缀,则代价为 \(x\)。
- 求最小代价和。
考虑建立 trie 树。然而 trie 树维护的是前缀,此题要求后缀。不需要很多麻烦的操作,因为此题答案只和后缀有关,把串反过来就好了。
然后在 trie 树上建一个图,具体地,trie 树上如果一个结尾点位于结尾点的子树,从深度小的向深度大的连边。
然后依照 dfs 序跑一次贪心就好了。
[SCOI 2016] 萌萌哒
首先 \(O(n^2)\) 的做法比较好想,搞一个并查集就好了。具体地,对于 \(l1 \sim r1\) 中每一个位置向 \(l2 \sim r2\) 对应的位置建立附属关系,最后 \(O(n)\) 查询得解。
然而只能获得部分分,因此考虑优化。
注意到只有一次询问,我们能否将修改和查询都降至 \(\log\) 级别呢?
这时,倍增的思想就呼之欲出了。我们将并查集分为 \(\log n\) 层,以位置 \(i\) 起始的第 \(j\) 层并查集维护了 \(i \sim i + 2^j - 1\) 的信息。在修改的时候,把 \(l \sim r\) 分为若干个 \(2\) 的次幂的块,在对应的并查集层级维护信息。
查询也是 \(\log\) 级别。我们只需要依次分裂并查集,对于以位置 \(i\) 起始的第 \(j\) 层并查集,我们可以将其分裂为以位置 \(i\) 起始的第 \(j-1\) 层并查集和以位置 \(i+2^(j-1)\) 起始的第 \(j-1\) 层并查集,直至分裂到只剩第 \(0\) 层,这时直接查询即可。
假设你查询的答案为 \(x\),注意答案并不是 \(10^x\),而是 \(9 \times 10^{x-1}\)。
Luogu P4735 最大异或和
可持久化 01-trie。
考前只学过主席树,没学过这玩意儿。但是类比上来还是很容易的,但是由于我太菜,在其他地方又栽了个跟头……
回到正题。考虑如果是询问 \(a_1 \oplus a_2 \oplus ... \oplus a_p \oplus x\) 的最大值 ,令 \(b_i = a_1 \oplus a_2 \oplus ... \oplus a_i\),则相当于在 \(l \sim r\) 中找到 \(p\) 使得 \(b_p \oplus x\) 最大,这是可持久化 Trie 树的裸题。
但是现在是询问 \(a_p \oplus a_{p+1} \oplus ... \oplus a_n \oplus x\) 。 考虑对 \(a_1 \oplus a_2 \oplus ... \oplus a_{p-1} \oplus x\) 异或上 \(b_n = a_1 \oplus ... \oplus a_n\) 则为所求式子 。
于是就很简单了,维护前缀异或和和前缀异或和的可持久化 01-trie,查询时直接令 \(q=b_n \oplus x\),让 \(q\) 在 \(l-1\) 和 \(r-1\) 之间的 01-trie 跑贪心就可以了。

浙公网安备 33010602011771号