牛客练习赛68 A.牛牛的mex

牛客练习赛68 A.牛牛的mex

题目链接

题目描述

牛牛现在有一个长度为 n n n 的序列 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an。现在牛牛有 q q q 次询问,每次想询问区间 [ l , r ] [l,r] [l,r] 的 mex 是什么。

一个序列的 mex 定义为最小未出现的自然数。

输入描述:

第一行两个整数 n , q n,q n,q 表示序列长度和询问次数。

接下来一行 n n n 个非负整数,表示序列 a i a_i ai

接下来 q q q 行,每行两个整数 l i , r i l_i,r_i li,ri 表示询问的区间。

输出描述:

q q q 行,每行表示询问的答案。

示例1

输入

5 2
4 3 0 1 2
2 4
1 5

输出

2
5

一个区间内最小未出现的自然数就等于不在这个区间内最小出现的自然数。预处理前缀后缀最小值就好了,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,q,l,r,a[N],pre[N],suf[N];
int main(){
     
    scanf("%d%d",&n,&q);
    pre[0]=suf[n+1]=n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) pre[i]=min(pre[i-1],a[i]);
    for(int i=n;i>=1;i--) suf[i]=min(suf[i+1],a[i]);
    while(q--){
     
        scanf("%d%d",&l,&r);
        printf("%d\n",min(pre[l-1],suf[r+1]));
    }
}

你可能感兴趣的:(前后缀和,牛客)