莫队算法是由清华大学神牛莫涛发明的一种处理区间问题的离线算法

算法核心是通过先将问询区间总长度平方分块、然后将所有的问询区间按照左端点所在的块编号排序、在同一块内的则按右端点升序

然后设置左右两个下标指针、每次都移动两个指针指向问询块的左右端点、在移动的过程中不断维护答案。

可以证明原本只通过两个下标指针移动来处理问询的方法最坏可达 O(N*Q) 经过莫队算法排序后可降为 O((N+Q)*sqrt(N))

所以莫队算法其实就是排个序

当然经过我粗略的概述肯定是无法讲清楚的,这里给出几个链接方便参考和学习此算法

莫队算法、还是莫队算法、当然还是莫队算法

一些题目

BZOJ Mato的文件管理

分析 :

对于每个区间、实际就是查询区间逆序对的个数。

看到数据范围和不强制在线考虑使用莫队算法解决、先确定分块长度然后对所有问询进行离线排序、关键在于怎么更新。

更新算法和指针左右移动密切相关,指针的移动可以看成从 左/右 添加或者删除一个数,那么这就很好做了

在左边添加一个数、比这个数小的都贡献了一个逆序对、加上

在右边添加一个数、比这个数大的都贡献了一个逆序对、加上

在左边删除一个数、原本比这个数小的都贡献了一个逆序对、减去

在右边删除一个数、原本比这个数大的都贡献了一个逆序对、减去

注意一下左右指针移动的时候是先指针移动再更新还是先更新再移动

#include<bits/stdc++.h>
#define lowbit(i) (i & (-i))
using namespace std;
const int maxn = 1e5 + 10;
struct QUERY{int L, R, Len, id;bool operator < (const QUERY &rhs) const{if((L/Len) == (rhs.L/rhs.Len)) return R < rhs.R;else return (L/Len) < (rhs.L/rhs.Len);};
}Q[maxn]; int ans[maxn];int arr[maxn], N;
int uni[maxn], uniLen;int Bit[maxn];inline void BitAdd(int i, int val)
{while(i <= N){Bit[i] += val;i += lowbit(i);}
}int BitSum(int i)
{if(i == 0) return 0;int ret = 0;while(i > 0){ret += Bit[i];i -= lowbit(i);}return ret;
}int GetVal(int i)
{int ret = lower_bound(uni, uni+uniLen, arr[i]) - uni;return ++ret;
}int main(void)
{scanf("%d", &N);for(int i=0; i<N; i++) scanf("%d", &arr[i]), uni[i] = arr[i];sort(uni, uni+N);///题目貌似没说每个元素的大小,干脆离散化好了uniLen = unique(uni, uni+N) - uni;int qNum, sqrt_N = (int)sqrt(N);scanf("%d", &qNum);for(int i=0; i<qNum; i++){scanf("%d %d", &Q[i].L, &Q[i].R);Q[i].Len = sqrt_N;Q[i].id = i;}sort(Q, Q+qNum);int val, curL, curR, CurAns = 0;curL = 1, curR = 0;for(int i=0; i<qNum; i++){///在左边添加一个数、比这个数小的都贡献了一个逆序对、加上while(curL > Q[i].L){curL--;val = GetVal(curL-1);BitAdd(val, 1);CurAns += BitSum(val-1);}///在右边添加一个数、比这个数大的都贡献了一个逆序对、加上while(curR < Q[i].R){curR++;val = GetVal(curR-1);BitAdd(val, 1);CurAns += curR - curL - BitSum(val-1);}///在左边删除一个数、原本比这个数小的都贡献了一个逆序对、减去while(curL < Q[i].L){val = GetVal(curL-1);BitAdd(val, -1);CurAns -= BitSum(val-1);curL++;}///在右边删除一个数、原本比这个数大的都贡献了一个逆序对、减去while(curR > Q[i].R){val = GetVal(curR-1);BitAdd(val, -1);CurAns -= curR - curL - BitSum(val-1);curR--;}ans[Q[i].id] = CurAns;}for(int i=0; i<qNum; i++) printf("%d\n", ans[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/LiHior/p/9136661.html

莫队算法 ( MO's algorithm )相关推荐

  1. 莫队算法(Mo's_Algorithm)

    一.定义 二.应用 莫队算法可用于解决一类可离线且在得到区间[l,r]的答案后,能在O(1)或O(log2⁡n)得到区间[l,r+1]或[l−1,r]的答案的问题 三.分析 http://www.cn ...

  2. 【笔记篇】莫队算法(一)

    P.S.:这个星期写了一个星期的莫队,现在也差不多理解了,下周该学点别的了(其实是被long long卡得生活不能自理......快要写吐了). 在本文开始之前,先orz莫涛-- 莫队算法(Mo's ...

  3. Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队算法

    链接: http://codeforces.com/problemset/problem/86/D 题意: 给你一个数组,每次询问一个区间,求对于每个数,算出这个数在这个区间出现的个数的平方再*这个数 ...

  4. 我也不知道该咋分类--莫队算法

    莫队算法可以一个可高效解决绝大多数离线+无修改+区间查询问题的算法.这类问题具体是指:如果知道[L,R]的答案时,可以在O(g(n))的时间下得到[L,R−1],[L,R+1],[L−1,R],[L+ ...

  5. 分治 —— 莫队算法

    [概述] 莫队算法(mo's algorithm)是用来解决离线区间不修改询问问题,可以将复杂度优化到 O(n^1.5),除去普通的莫队算法外,还有带修改的莫队.树上莫队等等. 莫队常用于维护区间答案 ...

  6. 曼哈顿距离最小生成树莫队算法

    参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...

  7. 莫队算法(小Z的袜子)

    目前的题型概括为三种:普通莫队,树形莫队以及带修莫队. 例题一:小Z的袜子 ·述大意: 进行区间询问[l,r],输出该区间内随机抽两次抽到相同颜色袜子的概率. ·分析: 对于L,R的询问.设其中颜色为 ...

  8. NBUT 1457 Sona(莫队算法+离散化)

    [1457] Sona 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Sona, Maven of the Strings. Of cause, she can play the ...

  9. XOR and Favorite Number CF340E 莫队算法

    题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...

最新文章

  1. Java实现的简单神经网络(基于Sigmoid激活函数)
  2. python怎么控制小数点位数_谈谈关于Python里面小数点精度控制的问题
  3. 如何在 Mac 上查找已保存的密码?
  4. VB中对数据库进行增、删、改操作
  5. 白硕:人工智能的诗与远方,一文读懂NLP起源、流派和技术
  6. win10插上耳机还外放解决解决方法
  7. 归纳偏执_防御性编程:足够偏执
  8. 小米路由器同一wifi局域网下,各主机无法ping连
  9. 男闺蜜下载 v1.6.2 安卓版
  10. 从6·18到广袤未来,PC世界需要一位猎光者
  11. JS/jQuery 遍历对象属性
  12. PTA练习:谁先倒.(C语言)
  13. Windows 安装 Windows 版 iCloud 之后我的电脑里多了个 iCloud 照片图标
  14. SWUST OJ 77: 计算员工周工资
  15. 架构师教大家如何用SpringBoot技术快速实现天气预报系统
  16. 南京邮电大学汇编语言程序设计实验一:汇编语言语法练习与代码转换
  17. matlab寻找一段曲线的极值点
  18. 如何把计算机窗口合成一个窗口,如何让电脑的某个窗口永远在最前端
  19. 机器狗病毒专杀和机器狗病毒样本研究
  20. 计算机图形学基础教程(Visual C++版)习题解答与编程实践(第2版)孔令德1-到第3章的直线扫描转换

热门文章

  1. HTTP之Referrer和Referrer-policy
  2. cad打开卡死_在打开cad文件的时候会出现死机的状态
  3. SQL SERVER 字符串转表函数
  4. SQL字符串转化数字
  5. 浅谈我国中小企业融资的问题及对策_毕业论文(20180404104959)
  6. ns-3学习手记11_ofswitch13安装教程
  7. 码云推荐 | 那些优秀的网络爬虫工具介绍
  8. 毕业季深度学习方面神器----恒源云gpu算力平台
  9. 「诗人艺术家ll著名诗人」胭脂茉莉十四行诗10首
  10. 计算机毕业设计源码分享双鱼林,双鱼林SSM图书信息管理系统毕业课程设计源码 - WEB源码|源代码 - 源码中国...