bzoj3339:rmqproblem&bzoj3585&洛谷4137:mex——题解(代码片段)

LuYouQi233 LuYouQi233     2022-11-11     464

关键词:

前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339

后者:

https://www.lydsy.com/JudgeOnline/problem.php?id=3585

https://www.luogu.org/problemnew/show/P4137

有一个长度为n的数组a1,a2,…,an。m次询问,每次询问一个区间内最小没有出现过的自然数。

题解大部分都是莫队分块,但是复杂度为O(n*sqrt(n))=5e2*2e5=1e8摸着良心说能过吗?

(莫队都是n=1e5的……然而慢点评测机也过不去,可能需要更小。)

参考:网上貌似就三篇的数据结构做法。

考虑数据结构吧,选择权值建主席树,每个节点记录当前区间的值在序列中出现位置的最小值。

这样查询的时候可以在r这棵树上找节点小于l的就行啦。

(如果小于,说明这段值域区间内有值不在序列区间内,否则全在,就需要考虑更大值。)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=4e5+5;
inline int read()
    int X=0,w=0;char ch=0;
    while(!isdigit(ch))w|=ch==\'-\';ch=getchar();
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;

struct node
    int l,r,min;
tr[N*20];
int rt[N],pool,n,m,q,b[N],a[N];
inline void LSH()
    sort(b+1,b+m+1);
    m=unique(b+1,b+m+1)-b-1;
    for(int i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+m+1,a[i])-b;

void insert(int y,int &x,int l,int r,int p,int v)
    tr[x=++pool]=tr[y];
    if(l==r)
    tr[x].min=v;
    return;
    
    int mid=(l+r)>>1;
    if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p,v);
    else insert(tr[y].r,tr[x].r,mid+1,r,p,v);
    tr[x].min=min(tr[tr[x].l].min,tr[tr[x].r].min);

int query(int x,int l,int r,int v)
    if(l==r)return l;
    int mid=(l+r)>>1;
    if(tr[tr[x].l].min<v)return query(tr[x].l,l,mid,v);
    else return query(tr[x].r,mid+1,r,v);

int main()
    n=read(),q=read();
    b[++m]=0;
    for(int i=1;i<=n;i++)
    a[i]=b[++m]=read();
    b[++m]=a[i]+1;
    
    LSH();
    for(int i=1;i<=n;i++)insert(rt[i-1],rt[i],1,m,a[i],i);
    for(int i=1;i<=q;i++)
    int l=read(),r=read();
    printf("%d\\n",b[query(rt[r],1,m,l)]);
    
    return 0;

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

bzoj_3585_mex&&bzoj_3339_rmqproblem_主席树

BZOJ_3585_mex&&BZOJ_3339_RmqProblem_主席树Description  有一个长度为n的数组a1,a2,...,an。m次询问,每次询问一个区间内最小没有出现过的自然数。Input  第一行n,m。  第二行为n个数。  从第三行开始,每行一个询问l,r。Output... 查看详情

bzoj3339:rmqproblem&bzoj3585&洛谷4137:mex——题解(代码片段)

前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339后者:https://www.lydsy.com/JudgeOnline/problem.php?id=3585https://www.luogu.org/problemnew/show/P4137有一个长度为n的数组a1,a2,…,an。m次询问,每次询问一个区间内最 查看详情

bzoj3585:mex&&3339:rmqproblem--主席树

3585:mexTimeLimit: 20Sec  MemoryLimit: 128MBDescription  有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。Input  第一行n,m。  第二行为n个数。  从第三行开始,每行一个询... 查看详情

bzoj3339:rmqproblem

3339:RmqProblemTimeLimit: 20Sec  MemoryLimit: 128MBSubmit: 1270  Solved: 666[Submit][Status][Discuss]DescriptionInputOutputSampleInput7502101321323143627SampleO 查看详情

bzoj3339rmqproblem

【bzoj3339】RmqProblem DescriptionInputOutputSampleInput7502101321323143627SampleOutput30324HINT分析离线算法。对于[l,r]区间的询问,我们可以线性求出来,然后考虑[l+1,r]区间有什么不同,在a[l]下一次出现的位置之前,所有大于a[l]的mex,都变成... 查看详情

bzoj3339:rmqproblem(代码片段)

【传送门:BZOJ3339】简要题意:  给出一个长度为n的数列,有m个询问,每个询问输入l,r,求出l到r之间没出现过的最小自然数题解:  同BZOJ3585参考代码:#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm&g... 查看详情

bzoj3339rmqproblem

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3339【题解】业界偷懒。突然发现好像可以主席树啊。。然后就强行上了一波发现确实可以。第i棵主席树维护[1...i]这个前缀内,某权值区间的“最小出现位置”。比如2301那么在rt[4]这... 查看详情

bzoj-3339:rmqbzoj-3585:mex

 3339:RmqProblem3585:mex题解:分块维护权值,用莫队转移。分块修改操作$O(1)$,查询$O(sqrt{A_{max}})$。莫队转移$O(msqrtn)$。总共是$O(msqrtn)$一份代码解决两道题。额外的经验!1#include<cmath>2#include<algorithm>3#include<cstdio>4 查看详情

bzoj3339&&bzoj3585莫队+权值分块

 显然若一个数大于n就不可能是答案。12#include<iostream>3#include<cstring>4#include<cstdio>5#include<algorithm>6#include<map>7#include<cmath>8usingnamespacestd;9constintMaxn=200 查看详情

rmqproblem

大视野——3339:RmqProblemTimeLimit: 20Sec  MemoryLimit: 128MBSubmit: 1192  Solved: 620[Submit][Status][Discuss]DescriptionInputOutputSampleInput750210132 查看详情

[bzoj3585][bzoj3339]mex

[BZOJ3585][BZOJ3339]mex试题描述有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。输入第一行n,m。第二行为n个数。从第三行开始,每行一个询问l,r。输出一行一个数,表示每个询问的答案。... 查看详情

bzoj3339

线段树+离线这种题既可以用莫队做也可以用线段树做,跟hh的项链差不多首先我们处里出前缀mex,也就是1->i的mex值,再预处理出每个数下一次出现的位置,然后把每个前缀mex插入线段树,每个节点表示l==r表示1->l的mex,然后... 查看详情

bzoj1477&&exgcd学习笔记

exgcd由于忘记了exgcd,这道题就没做出来。。。exgcd的用处是求ax+by=gcd(a,b)这样方程的解大概是这个样子的voidext_gcd(longlonga,longlongb,longlong&x,longlong&y){if(b==0){x=1;y=0;}else{ext_gcd(b,a%b,y,x);y-=x*(a/b);}}ViewCode证明大概是ax+b 查看详情

luogu4137:rmqproblem/mex

题面传送门Sol这题可能是假的离线莫队搞一搞,把数字再分块搞一搞,就行了#include<bits/stdc++.h>#defineILinline#defineRGregister#defineFill(a,b)memset(a,b,sizeof(a))usingnamespacestd;typedeflonglongll;constint_(2e5+5);ILllInput(){R 查看详情

bzoj1061&&bzoj3256

http://www.lydsy.com/JudgeOnline/problem.php?id=1061单纯形。。。先开始我不知道对偶,看着代码不知所措,并不能懂他们写的是什么。。。单纯形的标准形式是uoj上那样的,限制小于,最大化,但是这道题是最小化,而且系数取负还不行... 查看详情

bzoj3550:[ontak2010]vacation&&bzoj3112:[zjoi2013]防守战线(代码片段)

学了下单纯形法解线性规划看起来好像并不是特别难,第二个code有注释。我还有...*=-....这个不是特别懂第一个是正常的,第二个是解对偶问题的#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algor... 查看详情

bzoj2242计算器

1#include<bits/stdc++.h>2#defineinf10000000003usingnamespacestd;4typedeflonglongll;5intgcd(inta,intb){returnb==0?a:gcd(b,a%b);}6voidexgcd(inta,intb,int&x,int&y){7if(b==0){x=1;y=0;return; 查看详情

bzoj3585:mex|莫队算法

...;n的数就可以了因为大于n的数对答案肯定没有影响代码与BZOJ3339完全一样……似有又水了一题#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include... 查看详情