『数据结构』莫队、带修莫队、树上莫队详解(2)
需要注意的是,修改分为两部分:
分块大小的选择以及复杂度证明(用\(B\)表示分块大小,\(c\)表示修改个数,\(q\)表示询问个数,\(l\)块表示以\(l \div B\)分的块,每个\(l\)块包含\(n \div B\)个\(r\)块)
所以:总移动次数为\(O\left(\frac{cn^2}{B^2}+qB+\frac{n^2}{B}\right)\)。 由于一般的题目都不会告诉你修改和询问分别的个数,所以统一用\(m\)表示,即\(O\left(\frac{mn^2}{B^2}+mB+\frac{n^2}{B}\right)\)。 \(B\)可以取\[\frac{n^{2}}{3^{\frac{1}{3}}(9m^{3}n^{2}+\sqrt{3}\sqrt{27m^{6}n^{4}-m^{3}n^{6}})^{\frac{1}{3}}}+\frac{(9m^{3}n^{2}+\sqrt{3}\sqrt{27m^{6}n^{4}-m^{3}n^{6}})^{\frac{1}{3}}}{3^{\frac{2}{3}}m}\] 所以还是不要纠结带修莫队的最佳分块大小好了\(\cdots\cdots\)视作\(n=m\)的话,就可以得到总移动次数为\(O\left(\frac{n^3}{B^2}+nB+\frac{n^2}{B}\right)\),那么\(B=n^{\frac{2}{3}}\)时取最小值\(O\left(n^{\frac{5}{3}}\right)\)。 所以:带修莫队的渐进时间复杂度为\(O\left(nlogn+n^{\frac{5}{3}}\right)\)(视作\(n=m\))。 其它例题CF940F Machine Learning 树上莫队其实,莫队算法除了序列还可以用于树。复杂度同序列上的莫队(不带修\(O(n\sqrt{m}+mlogm)\),带修\(O\left(nlogn+n^{\frac{5}{3}}\right)\))。 例题[WC2013]糖果公园 分块方式这里需要看一道专门为树上莫队设计的题目 [SCOI2005]王室联邦。 用这道题所要求的方式进行分块,并用后文的方式更新答案,就能保证复杂度(复杂度分析见后文)。 那么如何满足每块大小在\([B,3B]\),块内每个点到核心点路径上的所有点都在块内呢? 这里先提供一种构造方式,再予以证明:
如果你看懂了这个方法的话,每块大小>=B是显然的,下面证明为何每块大小\(\le 3B\): 对于当前节点的每一棵子树:
对于 修改方式修改,就是由询问\((cu,cv)\) 更新至询问\((tu,tv)\)。 \(T(u,v)\)表示\(u\)到\(v\)的路径上除\(lca(u,v)\)外的所有点构成的集合; \(S(u,v)\)代表\(u\)到\(v\)的路径,\(xor\)表示集合对称差。
第二步证明如下: \(\quad\,T(cu,cv) xor T(tu,tv)\) \(=[S(cu,root) xor S(cv,root)] xor [S(tu,root) xor S(tv,root)]\) \(=[S(cu,root) xor S(tu,root)] xor [S(cv,root)]\) \(=T(cu,tu) xor T(cv,tv)\) 之所以要把\(T(cu,tv)\)转化成\(T(cu,tv)\),是因为这样的话就能通过对询问排序来保证复杂度。 关于单点修改树上莫队的单点修改和序列莫队类似,唯一不同就是,修改后是否更新答案通过\(\mathrm{vis}\)数组判断。 复杂度分析(编辑:ASP站长网) |