『数据结构』莫队、带修莫队、树上莫队详解
需要注意的是,修改分为两部分:
分块大小的选择以及复杂度证明(用(B)表示分块大小,(c)表示修改个数,(q)表示询问个数,(l)块表示以(l div B)分的块,每个(l)块包含(n div B)个(r)块)
所以:总移动次数为(Oleft(frac{cn^2}{B^2}+qB+frac{n^2}{B}right))。 由于一般的题目都不会告诉你修改和询问分别的个数,所以统一用(m)表示,即(Oleft(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}] 所以还是不要纠结带修莫队的最佳分块大小好了(cdotscdots)视作(n=m)的话,就可以得到总移动次数为(Oleft(frac{n^3}{B^2}+nB+frac{n^2}{B}right)),那么(B=n^{frac{2}{3}})时取最小值(Oleft(n^{frac{5}{3}}right))。 所以:带修莫队的渐进时间复杂度为(Oleft(nlogn+n^{frac{5}{3}}right))(视作(n=m))。 其它例题CF940F Machine Learning 树上莫队其实,莫队算法除了序列还可以用于树。复杂度同序列上的莫队(不带修(O(nsqrt{m}+mlogm)),带修(Oleft(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})数组判断。 复杂度分析(编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |