牛牛的mex
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
牛牛现在有一个长度为 n 的序列 a1,a2, …,an。现在牛牛有 q 次询问,每次想询问区间 [l,r]的 mex 是什么。
一个序列的 mex 定义为最小未出现的自然数。
输入描述:
第一行两个整数 n,q 表示序列长度和询问次数。
接下来一行 n 个非负整数,表示序列 ai。
接下来 q 行,每行两个整数 li,ri 表示询问的区间。
输出描述:
q 行,每行表示询问的答案。
示例1
输入
5 2
4 3 0 1 2
2 4
1 5
输出
2
5
备注:
n , q ≤ 105, 0 ≤ ai < n , 且 ai 互不相同
思路:
无论如何,区间内的最小值一定在区间外,那么只需要找l之前的最小值,和r之后的最小值,取其中最小的输出即可。
#include<iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <functional>
#include <ctime>
#include <iomanip>
#include <numeric>
#include <sstream>
#include <algorithm>
#define ll int
#define PI acos(-1)
#define mes(x,y) memset(x,y,sizeof(x))
#define lp pair<ll, ll>
#define FOR(i,a,b) for(long long i = a;i <= b;++i)
#define ROF(i,a,b) for(long long i = a;i >= b;--i)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
ll n, m, i, j, k = 0, t, w, flag, x, y, z, sum;
string s1, s2, s;
int main() {
while (cin >> n >> m) {
ll a[100020], pre1[100020], pre2[100020];
pre1[0] = pre1[n + 1] = pre2[0] = pre2[n + 1] = n;
FOR(i, 1, n)cin >> a[i], pre1[i] = min(pre1[i - 1], a[i]);
ROF(i, n, 1)pre2[i] = min(pre2[i + 1], a[i]);
while (m--) {
cin >> x >> y;
cout << min(pre1[x - 1], pre2[y + 1]) << endl;
}
}
}