Part -1: 参考资料
参考资料1
万分感谢这个大佬,祝他报送清华北大!
本文同步发表于知乎
Part 0: 一些介绍
莫队由莫涛神仙首次提出,是一种区间操作算法。
即便是板子题,难度也很高(差评)
所以,在阅读后文之前,请你先深呼吸,喝杯咖啡,吃点饼干,听听自己喜欢的歌
然后,,放下杯子,扔开饼干,摘下耳机,接受莫涛大神思想光辉的洗礼
Part 1:莫队算法的引入
先别谈莫队,我们来回顾一下,遇到线段树
也就是说,我们一直在通过维护两个序列——左序列
那么我们试着用线段树,首先,你需要维护左边的序列,然后你需要维护右边的序列,然后……
然后你会发现很难做到短时间甚至
而莫队的神奇之处在于他的独特优化:奇偶性排序
原代码:
int cmp(query a, query b) {
return belong[a.l] == belong[b.l] ? a.r < b.r : belong[a.l] < belong[b.l];
}
改为
int cmp(query a, query b) {
return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
别人说跑的很快我还不信,自己跑了一下才知道……
真的跑的很快啊……
Part 4: 能修改的莫队
我知道,你拿着上面别个大佬写的代码(再次膜拜写这个代码的大佬orz)兴冲冲的去刷题,一路上披荆斩棘,直到你看到了Luogu1903——国家集训队-数颜色,你彻底傻了眼
妈耶,他要是这么一修改我岂不是要重新sort?跑了跑了
由于莫队本身就是离线的,而你需要修改,得想个办法让他在线,具体做法是:“就是再弄一指针,在修改操作上跳来跳去,如果当前修改多了就改回来,改少了就改过去,直到次数恰当为止。”
(再次感谢这个大佬,,好喜欢这个解释)