专题2——进阶数据结构

UVA11997

考虑一个简化版,P1631,这个版本使用堆维护即可。

这个版本怎么做呢?依次合并每一行。

P6033

有一个性质,就是每一次合成出来的都是单调递增的,所以每次取出合的和没和的的最小的两个互相比较即可。

但是要预先排序,桶排即可。

P9565

考虑维护 \(60\) 个并查集,也就是维护对于每一位的连通性,然后判断是否有一条路径就是判断

\[\sum_{i=0}^{59} 2^i\operatorname{connected}(u,v) \geq V \]

但是实际上我们不是这么做的,而是考虑在二进制下,去除两者二进制的 \(\operatorname{LCP}\) 以后是否 \(val\) 的最高位是 \(1\),但是 \(V\) 的是 \(0\)

P6812

维护差分数组即可,先辈就是非严格单调递增序列,查询区间最小值即可,都是线段树基本操作。

P5522

你发现一件事情,\(n=1\) 可以使用无敌的线段树解决,\(n \le 30\) 其实可以用 \(30\) 棵线段树解决。

但是线段树常数过大,于是我们开了树状数组,因此直接干掉!

SP1716

妙妙题。

最大连续子段和的分治做法拍到线段树上即可。

CF1073D

转圈,转圈,转圈圈!

转一圈,取模,转一圈,取模。

取模至少减半,所以复杂度是对的。

P8306

板子。

P4551

发现一条路径就是两点到根的异或和的异或值。

所以拍一个 01-trie 求个最大异或对即可。

P6587

难题。

有两种做法,一种是根号分治,另外一种就是转完二进制以后,发现所操作的区间在 01-trie 上是一个子树,不过这颗 01-trie 需要二进制翻转以后建。

那么子树加,子树和。

把树拍平了,就是区间修改区间查询了。

P9364

限制是很强的。

你发现长度大于 \(450\) 的明显没用了,你发现按照长度排序一下,暴力即可。

posted @ 2023-10-05 15:29  luogu_gza  阅读(16)  评论(0)    收藏  举报