莫队、带修莫队、树上莫队详解
这几天学习了莫队算法,试着写一篇比较详细的莫队教程吧... 普通莫队 简介 莫队是一种基于分块思想的离线算法,用于解决区间问题,适用范围如下: 只有询问没有修改。 允许离线。 在已知询问 \([l,r]\) 答案的情况下可以 \(O(1)\) 得到 \([l,r-1],[l,r+1],[l-1,r],[l+1,r]\) 的答案。 满足以上三个条件就可以在 \(O(n\sqrt{m}+mlogm)\) 的时间复杂度下得到每个询问的解。 算法思想 莫队的精髓就在于通过对询问进行排序,并把询问的结果作为下一个询问求解的基础,使得暴力求解的复杂度得到保证。 上文中“适用范围”的第三点“ 在已知询问 \([l,r]\) 答案的情况下可以 \(O(1)\) 得到 \([l,r-1],[l,r+1],[l-1,r],[l+1,r]\) 的答案 ”即是“ 把询问的结果作为下一个询问求解的基础 ”的方法。 例: [国家集训队]小Z的袜子 在这题中,用 \(cnt_i\) 表示当前处理的区间内颜色为i的袜子出现的次数,用 \(\mathrm{len}\) 表示当前处理的区间的长度,用 \(x\) 表示新增的那只袜子的颜色。 以已知区间 \([l,r]\) 的答案求解区间 \([l,r+1]\) 为例。分别处理分子和分母: 分母为任选两只袜子的组合总数,原先是 \(\frac{\mathrm{len}*