莫队

基础莫队

本质是通过排序优化了普通尺取法的时间复杂度。

考虑如果某一列询问的右端点是递增的,那么我们更新答案的时候,右指针只会从左往右移动,那么i指针的移动次数是$O(n)$的。

当然,我们不可能让左右端点都单调来做到总体$O(n)$。

考虑对左端点进行分块。

莫队排序:

左端点按照分块的编号来排,如果分块编号不同的话编号较小的靠前,如果相同的话右端点小的在前。可以证明这样排完序的话时间复杂度可以做到$O(n \sqrt n)$。

这样我们把区间分成了$\sqrt n$块,每块的长度都是$\sqrt n$,在每一块内部,所有查询的右端点是递增的。

右指针:在每一块内部,右端点递增,所以右端点走的总数不会超过$n$(注意每一块内部放的是左端点,右端点是完全有可能超出这个块的范围的,因此这里为$n$),一共有$\sqrt n$块,所以右端点总共走的次数不会超过$n \sqrt n$。

左指针:先考虑每一次询问:

  1. 左指针在块内部移动,块的长度是$\sqrt n$,因此最多只会移动$\sqrt n$次。

  2. 左指针在相邻两块之间移动,最坏是从第一个块的左端点移动到第二个块的右端点,因此最坏移动$2 \sqrt n$次。

因为有q次询问,所以1是$q \sqrt n$,2是$2n$。

因为一共有$\sqrt n$个块,我们从前往后要跨过$\sqrt n - 1$次,每次最多是$2 \sqrt n$,所以时间复杂度是$2n$。

所以总时间复杂度为$O(q \sqrt n)$。

// 代码为统计一段区间上是否有不相同的数,没有输出yes
int n, q;
int a[N];
vector<array<int, 3>> v;
int cnt[210];
int ans[N];
int len; int get(int x) {
return x / len;
} void adds(int x, int &res) {
if (!cnt[x]) res ++;
cnt[x] ++;
} void del(int x, int &res) {
cnt[x] --;
if (!cnt[x]) res --;
} void solve() {
cin >> n >> q;
len = max(1, (int)sqrt((double)n * n / q));
for (int i = 1; i <= n; i ++) {
cin >> a[i];
a[i] += 100;
}
for (int i = 1; i <= q; i ++) {
int l, r;
cin >> l >> r;
v.push_back({i, l, r});
}
auto cmp = [&](array<int, 3> &a, array<int, 3> &b) {
int i = get(a[1]), j = get(b[1]);
if (i != j) return i < j;
return a[2] < b[2];
};
sort(v.begin(), v.end(), cmp);
// i是右指针,j是左指针
for (int k = 0, i = 0, j = 1, res = 0; k < q; k ++) {
int id = v[k][0], l = v[k][1], r = v[k][2];
while (i < r) adds(a[++ i], res);
while (i > r) del(a[i --], res);
while (j < l) del(a[j ++], res);
while (j > l) adds(a[-- j], res);
ans[id] = res;
}
for (int i = 1; i <= q; i ++)
if (ans[i] == 1) cout << "YES\n";
else cout << "NO\n";
}

莫队算法(基础莫队)小结(也做markdown测试)的更多相关文章

  1. hdu4638 莫队算法

    莫队算法基础题,题目看懂就能做出来 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  2. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  3. HDU 4358 莫队算法+dfs序+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)T ...

  4. CSU 1515 Sequence (莫队算法)

    题意:给n个数,m个询问.每个询问是一个区间,求区间内差的绝对值为1的数对数. 题解:先离散化,然后莫队算法.莫队是离线算法,先按按询问左端点排序,在按右端点排序. ps:第一次写莫队,表示挺简单的, ...

  5. XOR and Favorite Number(莫队算法+分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  6. 【国家集训队2010】小Z的袜子[莫队算法]

    [莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...

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

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:744   AC次数:210   平均分:44.44 将本题分享到:        查看未格式化的试题    ...

  8. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10299  Solved: 4685[Sub ...

  10. XIN队算法

    XIN队算法 注:名称由莫队算法改编而来 从luogu搬过来了... \(newly\;upd:2021.7.8\) \(newly\;upd:2021.6.6\) OI至高算法,只要XIN队算法打满 ...

随机推荐

  1. 【Java面试题】Mybatis

    五.MyBatis 40)谈谈 MyBatis Mybatis 是一个半自动化的 ORM 框架,它对 jdbc 的操作数据库的过程进行封装,使得开发者只需要专注于 SQL 语句本身,而不用去关心注册驱 ...

  2. 使用POI、JavaCsv工具读取excel文件(*.xls , *.xlsx , *.csv)存入MySQL数据库

    首先进行maven的配置:导入相关依赖 1 <dependency> 2 <groupId>org.apache.poi</groupId> 3 <artif ...

  3. 实例演示如何使用CCE XGPU虚拟化

    本文分享自华为云社区<CCE XGPU虚拟化的使用>,作者: 可以交个朋友. 一 背景 在互联网场景中,用户的AI训练和推理任务对GPU虚拟化有着强烈的诉求.GPU卡作为重要的计算资源不管 ...

  4. linux 简单的mysql备份和导入

    linux 简单的mysql备份和导入 一.数据库的备份与导入 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 例:mysqldump -u dbadmi ...

  5. Go 语言中 For 循环:语法、使用方法和实例教程

    for循环用于多次执行特定的代码块,每次都可以使用不同的值.每次循环执行都称为一次迭代.for循环可以包含最多三个语句: 语法 for 语句1; 语句2; 语句3 { // 每次迭代要执行的代码 } ...

  6. Chrome浏览器前端开发调试时强制更新js、css静态资源文件缓存的方法

    以Chrome浏览器为例,国产浏览器未做全面测试.前端开发静态文件时,浏览器访问会缓存样式.图片.js等,怎么快速更新缓存. 以下方法特别适合只想清除某个网页的缓存,而不想清除全部浏览器缓存可以采用以 ...

  7. 详讲openGauss 5.0 单点企业版如何部署_Centos7_x86

    本文分享自华为云社区<openGauss 5.0 单点企业版部署_Centos7_x86>,本文作者:董小姐 本文档环境:CentOS7.9 x86_64 4G1C40G python2. ...

  8. java集合源码详解

    一 Collection接口 1.List 1.1ArrayList 特点 1.底层实现基于动态数组,数组特点根据下表查找元素速度所以查找速度较快.继承自接口  Collection ->Lis ...

  9. android虚拟机硬件加速问题

    前言 创建的android 虚拟机的如果我们选择x86,那么会出现需要硬件加速. 步骤 那么打开虚拟功能后可以进行安装,SDK Manager-> Extras->Intel Hardwa ...

  10. 使用 Docker 部署 Draw.io 在线流程图系统

    1)介绍 Draw.io GitHub:https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具,拥有大量免费素材和模板.程序本身支持中文在内的多 ...