首页 > 其他 > 详细

题目归档 #6

时间:2020-08-02 17:46:23      阅读:86      评论:0      收藏:0      [点我收藏+]

目录及链接

[SCOI 2016] 背单词

首先这是一道语文题(233)

翻译题目后,我们可以知道有如下的题意:

  • 给你 \(n\) 个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串 \(s\) 的位置为 \(x\)):
    1. 排在 \(s\) 后面的字符串有 \(s\) 的后缀,则代价为 \(n^2\)
    2. 排在 \(s\) 前面的字符串有 \(s\) 的后缀,且没有排在 \(s\) 后面的 \(s\) 的后缀,则代价为 \(x-y\)\(y\) 为最后一个与 \(s\) 不相等的后缀的位置);
    3. \(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 跑贪心就可以了。

题目归档 #6

原文:https://www.cnblogs.com/sqrtyz/p/13418651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!