牛牛的mex
链接:https://ac.nowcoder.com/acm/contest/7079/A
思路:
让求在这个区间的最小未出现的最小自然数,那么可以反向思维来求不在这个区间出现的最小自然数。那么维护一个前缀和后缀最小值即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int a[maxn];
int sm[maxn], bm[maxn];
int main()
{
int n, q;
cin >> n >> q;
sm[0] = n; bm[n+1] = n;
for(int i = 1; i <= n; i++){
cin >> a[i];
sm[i] = min(sm[i-1], a[i]);
}
for(int i = n; i >= 1; i--){
bm[i] = min(bm[i+1], a[i]);
}
int l, r;
for(int i = 1; i <= q; i++){
cin >> l >> r;
cout << min(sm[l-1], bm[r+1]) << endl;
}
}

