求助昨晚 ABC E 题
  • 板块学术版
  • 楼主AmamiyaYuuko
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/3/7 15:32
  • 上次更新2023/11/5 02:20:44
查看原帖
求助昨晚 ABC E 题
124152
AmamiyaYuuko楼主2021/3/7 15:32

感觉没有任何问题,交上去 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;
}
2021/3/7 15:32
加载中...