莫队 mex

P4137 Rmq Problem / mex (三种解法: 权值线段树+询问离线 / 可持久化线段树 / 莫队+值域分块) 题目链接: P4137 Rmq Problem / mex 大致题意 给定一个长度为nnn的序列, 有mmm次询问操作. 每次询问[l,r][l, r][l,r]区间的mexmexmex是多少. 解题思路 解法一: 权值线段树 + 询问离线 我们考虑把所有的询问按照右端点rrr从小到大排序, 用权值线段树维护[1,r][1, r][1,r]区间中所有数值最后一次出现位置的最小值. 对于询问区间[l,r][l, r][l,r], 我们在树上进行二分, 如果当前值域左区间的最小出现位置要小于lll, 则访问左区 阅读详情

问题 G: mex
时间限制: 2 Sec 内存限制: 128 MB
题目描述
  有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。
输
  第一行n,m。
  第二行为n个数。
  从第三行开始,每行一个询问l,r。
输出
  一行一个数,表示每个询问的答案。
样例输入
5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5
样例输出
1
2
3
0
3
提示
数据规模和约定
  对于100%的数据:
  1<=n,m<=200000
  0<=ai<=109
  1<=l<=r<=n
  对于30%的数据:
  1<=n,m<=1000

第一次做到这种暴力套暴力的题。。莫队套分块。
最开始我想把答案在左右端点推移时就修改,发现太麻烦,反而更慢。
那么以数为块,把所有数加一,就排除了0的情况,最后减回来即可。而且数组不需要开太大,到n即可。因为如果出现>n的数一定不符合。
只是修改分块,记录下这个块有多少个数出现过,最后正大光明地找到第一个不全出现的块,枚举即可。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 201000
using namespace std;
struct Q{int l,r,id;}q[N];
int n,m,h,a[N],sum[N],kuai[N],ans[N];
int b[N],shu[1000];
inline bool cmp(Q a,Q b){return kuai[a.l]==kuai[b.l]?a.r<b.r:kuai[a.l]<kuai[b.l];}
int main()
{
    scanf("%d%d",&n,&m);h=sqrt(n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]++,kuai[i]=(i-1)/h+1;
    for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
    sort(q+1,q+m+1,cmp);
    int l=0,r=0;
    for(int i=1;i<=m;i++)
    {
        for(;l<q[i].l;l++)
        {
            if(a[l]>=n)continue;
            sum[a[l]]--;
            if(sum[a[l]]==0)shu[kuai[a[l]]]--;
        }
        for(;l>q[i].l;l--)
        {
            if(a[l-1]>=n)continue;
            if(sum[a[l-1]]==0)shu[kuai[a[l-1]]]++;
            sum[a[l-1]]++;
        }
        for(;r<q[i].r;r++)
        {
            if(a[r+1]>=n)continue;
            if(sum[a[r+1]]==0)shu[kuai[a[r+1]]]++;
            sum[a[r+1]]++;

        }
        for(;r>q[i].r;r--)
        {
            if(a[r]>=n)continue;
            sum[a[r]]--;    
            if(sum[a[r]]==0)shu[kuai[a[r]]]--;
        }
        for(int k=1;k<=kuai[n];k++)
            if(shu[k]!=h)
            {
                for(int j=(k-1)*h+1;j<=min(n,k*h);j++)
                    if(!sum[j]){ans[q[i].id]=j;break;}
                break;
            }
    }
    for(int i=1;i<=m;i++)printf("%d\n",ans[i]-1);
}
告别混乱!用Cadence Capture CIS高效管理你的原理图库:以单逻辑器件K9F2G08U0M为例 本文以单逻辑器件K9F2G08U0M为例,详细介绍了如何使用Cadence Capture CIS高效管理原理图库。通过三级分类体系、工程化命名规范和智能检索技术,帮助工程师实现从混乱到有序的转变,提升团队协作效率和设计准确性。 阅读详情

相关推荐

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

离线区间Mex问题的O(nlogn)算法

处理办法是,在离散化的过程中,加入每个数+1。我们的问题就变成了:对于当前的状态,所有数最后一次出现的位置中,比我所查询的左端点。区间Mex问题,简单说来,就是要查询区间最小未出现正整数(非负整数和正整数可以通过整体加减一相互转换,这里不作区分了)。大等于左子树的最小值,就去往左子树,否则去往右子树,直到到达叶子节点,这个节点代表的数就是我要找的最小未出现的数。现在查到的结果作为排名找到原来的数字,结果就是正确的。,维护每个数字最后一次出现的位置,通过线段树维护位置的最小值。,因此总的复杂度也是。

ararakitsukihi的博客 663

MCU启动流程详解

在MCU启动后,系统从flash主存储区开始执行,先将0x08000000地址存放的堆栈栈顶指针赋给SP寄存器,将0x08000004地址存放的Reset_Handler复位向量地址赋给PC寄存器跳转执行系统复位,期间执行System_Initializes函数配置系统时钟,重定位向量表,执行MDK自带库函数__main将RW、ZI数据段从Flash加载到RAM,并跳转至_rt_entry进行Stack和Heap的初始化,最后跳转到熟悉的main函数。

weixin_50827397的博客 1505

线段树/莫队-区间mex查询 NKOJ4254

题目 给你一个长度为n的数列,元素编号1到n,第i个元素值为Ai。现在有m个形如(L,R)的提问,你需要回答出区间[L,R]的mex值。即求出区间[L,R]中没有出现过的最小的非负整数。 详细见NKOJ4254 总结一下这道题的三种解法1.莫队分块,参考NewUser代码,非常暴力另两种需要分析一下提前计算Mi=mex(1,i),1<=i<=...

weixin_30507269的博客 334

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3733

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 308

Frank Sinatra【树上莫队】【分块】【区间mex】

题目链接:https://vjudge.net/problem/Gym-100962F 题目大意:给你一棵树,边有边权,每次询问一条链上边权集合的mex。 用莫队加分块维护区间mex。 有一个很重要的点是,边权最大到1e9,但是显然大于 N 的权值对答案一定没有贡献,这样的话数组就可以开的下了。 #include <bits/stdc++.h> #define rep(...

蒟蒻 lxw的博客 562

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2262

BZOJ 3585 Mex (莫队 + 分块)

Description   有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。    Input   第一行n,m。   第二行为n个数。   从第三行开始,每行一个询问l,r。 Output   一行一个数,表示每个询问的答案。    Examples Sample Input 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 Sample Output 1 2 3 0 3 Note 1≤n,m≤2000001 \leq n,m \leq

chr1stopher 252

Codex入门10-Goal自主任务(进阶必学:设定目标就不管了,AI自己干活到完成)

/goal 是Codex CLI最强大的进阶功能——设定一个目标,AI就会制定计划、分步执行、自我测试、持续迭代,即使你关掉终端也会继续。本文详解/goal的工作原理、配置启用方法、常用命令(pause/resume/status/clear),以及如何写出高质量的目标描述让AI高效自主完成任务。

yueyeguzhuo的专栏 455

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 816

[BZOJ 3585] mex 【莫队+分块】

题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数。 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数。 然后求mex用分块,将权值分块(显然mex 一定小于等于 n ,大于 n 的权值没有意义,可以直接忽略),每块大小 sqrt(n) 。 然后区间中的某个数的数量被减到0的时候就将它所在的块的种类计数减一,添加数的时候类...

weixin_30815427的博客 129

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效。字体图标库:Font Awesome。技术栈:HTML+CSS+JS。

艾恩小灰灰的博客 907

洛谷P4137 Rmq Problem / mex 基础莫队

洛谷P4137 Rmq Problem / mex 标签 基础莫队 前言 我的csdn和博客园是同步的,欢迎来访danzh-博客园~ 很简单的莫队哦 简明题意 询问区间[L,R]中不存在的最小的数 思路 一看题,感觉莫队可以写。然后看看容不容易转移~ 首先remove,假设当前区间最小的不存在的数是ans。那么很显然的是,当前区间中一定存在[0,ans)中的所有数,ans这...

danzh 249

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex

题面:P4137Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案。 除了bzoj3339以外,另外两道题Ai范围都是1e9。显然最劣情况下答案是N,所以大于N的Ai都直接无视就可以。 由于求的是最小的自然数,自然数包括0,所以要额外处理一下含有0的块。我这里是直接把0拖出来放在第0块了。 代码: ...

weixin_30617737的博客 80

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

P4137 Rmq Problem / mex (莫队)

题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\);若不等于\(mex\),没有影响,因为它之前的所有数都出现过了,又出现一次不会怎样,放在后面又比\(mex\)大,肯定不是\(mex\). 取出数的时候,如果这个数出现的次数变为了\(0\...

223

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[莫队] [分块] [BZOJ3585] mex

题目描述 Description 有一个长度为nn的数组{\{a1,a2,...,ana1,a2,...,an}\}。mm次询问,每次询问一个区间内最小没有出现过的自然数。 输入 Input 第一行nn,mm。 第二行为nn个数。 从第三行开始,每行一个询问ll,rr。 输出 Output 一行一个数,表示每个询问的答案。 样例输入 Sample Input 5 5

HeRaNO@HSAHRBNU 780

BZOJ 3339 && luogu4137 Rmq Problem / mex(莫队)

P4137 Rmq Problem / mex 题目描述 有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 输入输出格式 输入格式: 第一行n,m。 第二行为n个数。 从第三行开始,每行一个询问l,r。 输出格式: 一行一个数,表示每个询问的答案。 输入输出样例 输入样例#1: 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 ...

weixin_30872789的博客 107

[BZOJ3585]mex(莫队+分块)

显然可以离线主席树,这里用莫队+分块做。分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补。 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每块记录块内的所有值是否在此当前区间内都已存在。 这样每次暴力从L到R分别放入这个表,最后从小到大询问每个块是否已满,若没有则在块内枚举第一个不存在的数。 注意到这样的总修改复杂度O(nq),查询...

weixin_30826761的博客 166

[BZOJ3585]-mex-莫队+分块

说在前面 Emmmm闲着没事切一道莫队,半小时码+调 感觉自己码力又增加了 题目 BZOJ3585传送门 题目大意 给出一个长为N的数字串,多次询问区间中没有出现过的自然数的最小值 输入输出格式 输入格式: 第一行两个整数N,M,表示数字串长度和询问个数 接下来N个整数表示数字串 再接下来M行,每行两个整数L,R表示一个询问 输出格式: 对于每个询问,输出

泉華子的OI足迹 592

BZOJ 3585: mex(分块+莫队)

传送门 解题思路   首先直接莫队是能被卡的,时间复杂度不对。就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt(n)) 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath&g...

weixin_30748995的博客 103

#莫队,分块#洛谷 4137 JZOJ 3547 mex

题目 有一个长度为nnn的数组[a1,a2,...,an][a1,a2,...,an][a1,a2,...,an]。mmm次询问,每次询问一个区间内最小没有出现过的自然数。 分析 其实这道题出的不算很好,因为即使a≤109a\leq 10^9a≤109,也只是纸老虎,因为一共才不超过2×1052\times 10^52×105个数,嗯,所以其实并没有什么用,只要把超过nnn的数都变成n+1n+1...

lemondinosaur的博客 236

BZOJ 3585: mex【莫队+树状数组】

3585: mex 【题目描述】 传送门 【题解】 其实和BZOJ3339一模一样,当Ai>n时这个Ai对答案没有影响,这是肯定的,那么读入时处理一下就可以了。 代码如下 #pragma GCC optimize(2) #include<cmath> #include<cstdio> #include&l...

aiweiluan5095的博客 135
上一篇: 单调队列 bzoj3126 [Usaco2013 Open]Photo
下一篇: 线段树合并 [HNOI2012]永无乡
QTY_
博客等级 码龄9年 13粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值