神奇的莫队算法……(话说标准的莫队算法写的都是Manhattan MST?好吧我偷懒写的是更弱的Manhattan Distance下的Hamilton Path近似解……
不过对于随机数据比写矬了的MST还快一点……)
分块的时候其实可以不用显式地储存每块的坐标范围……只要每扫够B格排序一次即可。
顺便还有这样一个小小的细节……考虑二维坐标系中的一个最小曼哈顿距离哈密尔顿路径的近似解,如果在当前块中我们走到了最靠上的一个点,那么在走下一块的时候明显是从上往下走更优>_<所以我就写了一对y轴的比较函数,交替使用……
bool cmp2(const Query &a, const Query &b){return a.R < b.R;}
bool cmp3(const Query &a, const Query &b){return a.R > b.R;}
typedef bool(*CMP_FUNC)(const Query &, const Query &);
CMP_FUNC func[2] = {cmp2, cmp3};