感觉没有任何问题,交上去 wa 了一个点
题目大意是滑动窗口求 mex 最小值
思路是用 nxt[i] 存 i 下一次出现的最靠前的位置,如果 nxt[i] 和 i 之间能放下一个长度为 m 的区间就更新答案
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
template <class T>
inline void read(T &x) {
x = 0;
int f = 0;
char ch = getchar();
while (!isdigit(ch)) { f |= ch == '-'; ch = getchar(); }
while (isdigit(ch)) { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
x = f ? -x : x;
return ;
}
typedef unsigned long long uLL;
typedef long long LL;
int a[1500010], nxt[1500010], t[1500010];
int n, m, ans;
bool b[1500010];
int main() {
read(n), read(m);
ans = n;
for (int i = 1; i <= n; ++i) read(a[i]), ++t[a[i]];
for (int i = 0; i < n; ++i) {
if (!t[i]) {
ans = i;
break;
}
}
for (int i = 1; i <= n; ++i) {
if (i > m && (!b[a[i]])) ans = std::min(ans, a[i]);
b[a[i]] = true;
}
for (int i = n; i >= 1; --i) {
if (!nxt[a[i]]) {
nxt[a[i]] = i;
if (n - i + 1 > m) ans = std::min(ans, a[i]);
continue;
}
if (nxt[a[i]] - i + 1 > m + 2) ans = std::min(ans, a[i]);
nxt[a[i]] = i;
}
printf("%d\n", ans);
return 0;
}