莫队算法:
①适用问题:大量区间的个数统计问题,由于莫队是典型的离线算法,故不能解决区间存在修改的问题。
比较典型的问题有“给定一个大小为N的数组,数组中所有元素的大小<=N。你需要回答M个查询。每个查询的形式是L,R。你需要回答在范围[ L,R ]中至少重复3次的数字(或者至少重复一次的数,即这个区间中不同的数)的个数。 ”
②基本思想:其实莫队就是基于暴力大法而进行的优化,先来介绍暴力的方法:既然询问的是各个区间中的数的个数问题,那么可以开一个数组cnt,用来记录各个数字出现的次数,每次询问,就用cnt数组对[L,R]中的各个数进行个数统计。显而易见,当询问次数很多的时候,明显会很耗时。而仔细分析后,不难发现,多个区间查询时,做了很多“重复工作”,这也就浪费了大量时间,所谓重复工作是指,当前询问的区间中的一部分,也出现在之前的询问中,那么每次都对这些重复的部分进行重新统计,就浪费了很多时间。
基于这个,莫队就是很好的利用了之前统计的区间,避免了很多重复统计。大概来说,就是设置两个指针L和R,对于每一个询问区间,分别移动L和R指针,直到L==当前询问区间的左边界 && R==当前询问区间的右边界。在移动L和R的过程中,同时更新统计信息(也就是cnt数组以及当前询问区间的答案)。
具体的讲解可以参见:https://blog.csdn.net/hnshhslsh/article/details/50582926
③模板代码:见这篇博客:https://www.cnblogs.com/five20/p/7603849.html
注意++L,L--等:何时前++和何时后++
④例题:
大视野oj1878:https://www.lydsy.com/JudgeOnline/problem.php?id=1878
AC代码:
#include