数据结构选练

数据结构题目练习。

I P10690 Fotile 模拟赛 L

首先有显然的 可持久化 Trie,但是暴力是 \(\mathcal{O}(nm\log{V})\),找不到奇妙东西维护,我们就 大力分块,设块长为 \(B\),则我们预处理 \(pre_{i,j}\) 表示从第 \(i\) 块开头到 \(j\) 点的最大异或和,复杂度 \(\mathcal{O}(\frac {n^2} B\log{V})\),查询中,对于整块直接拿,对于散块,我们暴力查询,复杂度 \(\mathcal{O}(nB\log{V})\)

总复杂度 \(\mathcal{O}(n\sqrt{n}\log{V})\)

代码

II P4587 [FJOI2016] 神秘数

首先我们考虑神秘数的性质,一个集合 \(S\),我们将其排序后从小到大枚举,假设当前神秘数为 \(now\),上次神秘数为 \(last\) (若没有则为 \(0\)),当前枚举值为 \(val\),则相当于所有值都可以向右平移一段 \(val\) 的区间。

  • \(last + 1 \leq val \leq now + 1\),则平移后的区间可以覆盖到 \(now\),则应该使 \(now \gets now + val\)
  • 否则,平移后的区间一定不可以覆盖到 \(now\),且 \(S\) 集合剩余值也不可以,直接结束即可。

上述复杂度是 \(\log({\sum{S}})\) 的。

证明:若 \(last + 1 \leq val \leq now + 1\),则会使 \(now\) 至少加 \(last\),则相当于 \(now\) 每次扩大 两倍,即复杂度为 \(\log{(\sum S)}\)

查询区间 \([l,r]\) 且值域在 \([v,u]\) 之间的权值和,可用主席树解决。

复杂度 \(\mathcal{O}(n\log{n}\log{(\sum {a_i})})\)

代码

III P3247 [HNOI2016] 最小公倍数

首先可以不是简单路径,这启示我们用并查集,但 \(a,b\) 的二维限制有些不可做,我们可以先想暴力,对于每个询问只需将所有 \(a_i \leq a\)\(b_i \leq b\) 的所有边加入并查集,并维护最大 \(a,b\) 值,判断 \(u,v\) 是否在一个联通块内,且最大值即为 \(a,b\),这样可以 \(\mathcal{O}(mq\log{n})\)

限制太特殊了,我们考虑分块,首先将所有边按照 \(a\) 排序后分块,每个询问离线下来后把其放到尽量右块内,使所有其左边的块的 \(a\) 值都小于等于它,然后我们枚举每个块,将该块询问先按照 \(b\) 排序,再将前面的块按照 \(b\) 排序,双指针加边即可。

对于在该块内的边,我们暴力枚举加边,枚举后撤销这些操作,所以 并查集不能路径压缩,只能按秩合并。

复杂度 \(\mathcal{O}(qB\log{n} + \frac {m^2} B \log{n})\),取 \(B = \sqrt{m}\) 得复杂度为 \(\mathcal{O}((q + m)\sqrt{m}\log{n})\)

但是貌似 \(B = \sqrt{m\log{n}}\) 跑的最快 : )。

代码

``

posted @ 2024-08-28 21:30  oXUo  阅读(10)  评论(0)    收藏  举报
网站统计