結果

問題 No.3075 Mex Recurrence Formula
ユーザー Nauclhlt🪷
提出日時 2025-03-28 23:11:34
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,602 bytes
コンパイル時間 2,372 ms
コンパイル使用メモリ 204,920 KB
実行使用メモリ 7,328 KB
最終ジャッジ日時 2025-03-28 23:11:42
合計ジャッジ時間 7,333 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 5 TLE * 1 -- * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main()
{
    int N;
    cin >> N;
    ll X;
    cin >> X;
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];

    if (1 <= X && X <= N)
    {
        cout << A[X - 1] << endl;
        return 0;
    }

    vector<int> f(N + 1);
    vector<int> cf(N + 1);
    set<int> ex;
    for (int i = 0; i < N; i++)
    {
        if (A[i] <= N)
            f[A[i]]++;
    }
    for (int i = 0; i <= N; i++)
    {
        if (f[i] == 0) ex.insert(i);
        cf[f[i]]++;
    }

    queue<int> cur;
    for (int i = 0; i < N; i++) cur.push(A[i]);
    X -= N;
    for (int i = 0; i < X; i++)
    {
        int mex = *ex.begin();
        
        if (cf[1] == N)
        {
            long rest = X - i;
            int pos = (int)((rest + N) % (N + 1));
            if (pos == 0) cout << mex << endl;
            {
                for (int i = 0; i < pos; i++)
                {
                    cur.pop();
                }
                cout << cur.front() << endl;
            }
            return 0;
        }
        
        cur.push(mex);

        ex.erase(mex);
        cf[f[mex]]--;
        f[mex]++;
        cf[f[mex]]++;

        if (cur.front() > N)
        {
            cur.pop();
        }
        else
        {
            if (f[cur.front()] == 1) ex.insert(cur.front());
            cf[f[cur.front()]]--;
            cf[f[cur.front()] + 1]++;
            f[cur.front()]--;
            cur.pop();
        }
    }

    while (cur.size() > 1)
    {
        cur.pop();
    }
    cout << cur.front() << endl;
}
0