在此说一下本渣对莫队算法思想的一些浅薄理解
莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n)
小Z的袜子是一道非常经典的题目.:题目链接http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29469#problem/A
我们先对整个区间分块,然后按照左区间所在的块进行排序,如果左区间在相同的块内,则按照右区间进行排序.
如此相当于对每个左区间在相同块内的询问,我们只要右区间从最小迭代到最大即可.也就是说我们把算法的复杂度的锅让区间的左端点来背 = =,恩......
当然了,既然使用如上算法,那么显然我们要进行离线处理.
具体代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cmath>
#include <set>
using namespace std;
int n, m, a[100010], num[100010], unit;
struct N { //存询问的信息
int l, r, id;
bool operator < (const N &rhs) const { //先按照左端点是否所在块进行排序,然后按照右端点排