AtCoder Beginner Contest 194 E. Mex Min

链接

https://atcoder.jp/contests/abc194/tasks/abc194_e

题意

定义 m e x ( x 1 , x 2 , … , x k ) mex(x_1,x_2,\dots,x_k) mex(x1​,x2​,…,xk​) 为在 x 1 , x 2 , … , x k x_1,x_2,\dots,x_k x1​,x2​,…,xk​ 中未出现的最小自然数

求 min ⁡ i = 0 n − m [ m e x ( a i + 1 , a i + 2 , … , a i + m ) ] \min_{i=0}^{n-m}{[mex(a_{i+1},a_{i+2},\dots,a_{i+m})]} mini=0n−m​[mex(ai+1​,ai+2​,…,ai+m​)]

数据范围:

  • 0 ≤ m ≤ n ≤ 1.5 ∗ 1 0 6 0 \le m \le n \le 1.5*10^6 0≤m≤n≤1.5∗106
  • 0 ≤ a i < n 0 \le a_i <n 0≤ai​<n

思路

记录每个值出现的下标

枚举 [ 0 , n ] [0,n] [0,n],判断是否存在长度大于 m m m 的区间中未出现该值

代码

#include <bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long double LD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
// head
const int N=1500005;
VI pos[N];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) {
        int x;
        cin>>x;
        pos[x].PB(i);
    }
    for(int i=0;i<=n;i++) {
        if(!SZ(pos[i])) return cout<<i<<'\n',0;
        for(int j=0;j<SZ(pos[i]);j++) {
            if(!j&&pos[i][j]>m) return cout<<i<<'\n',0;
            if(j&&pos[i][j]-pos[i][j-1]-1>=m) return cout<<i<<'\n',0;
            if(j==SZ(pos[i])-1&&n-pos[i][j]>=m) return cout<<i<<'\n',0;
        }
    }
    return 0;
}
上一篇:Java < - >非Applet的Javascript?


下一篇:AtCoder Beginner Contest 123