Part -1: 参考资料

参考资料1
万分感谢这个大佬,祝他报送清华北大!
本文同步发表于知乎


Part 0: 一些介绍

莫队由莫涛神仙首次提出,是一种区间操作算法。

即便是板子题,难度也很高(差评)

神奇的莫队-LMLPHP

所以,在阅读后文之前,请你先深呼吸,喝杯咖啡,吃点饼干,听听自己喜欢的歌

然后,,放下杯子,扔开饼干,摘下耳机,接受莫涛大神思想光辉的洗礼


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——国家集训队-数颜色,你彻底傻了眼

    神奇的莫队-LMLPHP

    妈耶,他要是这么一修改我岂不是要重新sort?跑了跑了

    神奇的莫队-LMLPHP

    由于莫队本身就是离线的,而你需要修改,得想个办法让他在线,具体做法是:“就是再弄一指针,在修改操作上跳来跳去,如果当前修改多了就改回来,改少了就改过去,直到次数恰当为止。”
    (再次感谢这个大佬,,好喜欢这个解释)

    09-20 13:07