01、基础莫队算法
莫队算法 = 离线 + 暴力 + 分块。
“离线”和“在线”的概念。在线是交互式的,一问一答;如果前面的答案用于后面的提问,称为“强制在线”。离线是非交互的,一次性读取所有问题,然后一起回答,"记录所有步,回头再做”。
基础的莫队算法是一种离线算法,它通常用于不修改只查询的一类区间问题,复杂度O(n√n),没有在线算法线段树或树状数组好,但是编码很简单。下面是一道莫队模板题。
HH项链 洛谷 1972
题目描述:给定一个数量,询问某个区间内不同的数有多少个。
输入:第一行一个正整数 n,表示数列长度。第二行n个正整数 ai。第三行一个整数m,表示HH 询问的个数。接下来 m 行,每行两个整数 L,R,表示询问的区间。
输出:输出m行,每行一个整数,依次表示询问对应的答案。
题目询问区间内不同的数有多少个,即去重后数字的个数,本题的标准解法是线段树或树状数组。下面首先给出暴力法,然后再引导出莫队算法。
1. 暴力法
可以用STL的unique()函数去重,一次耗时O(n),m次的总复杂度O(mn)。或者自己编码, 用扫描法统计数字出现的次数,这是一种简单易行的暴力法。
(1)查询一个区间有多少个不同的数字
定义cn