数据结构选练
数据结构题目练习。
首先有显然的 可持久化 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})\)。
首先我们考虑神秘数的性质,一个集合 \(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})})\)。
首先可以不是简单路径,这启示我们用并查集,但 \(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}}\) 跑的最快 : )。
``