結果
問題 |
No.3075 Mex Recurrence Formula
|
ユーザー |
![]() |
提出日時 | 2025-03-28 21:33:15 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 802 ms / 2,000 ms |
コード長 | 1,097 bytes |
コンパイル時間 | 1,083 ms |
コンパイル使用メモリ | 106,776 KB |
実行使用メモリ | 35,816 KB |
最終ジャッジ日時 | 2025-03-28 21:33:36 |
合計ジャッジ時間 | 20,387 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
#include<iostream> #include<vector> #include<map> #include<set> using namespace std; int main() { int N;long long X; cin>>N>>X; vector<int>A(N); set<int> mex; map<int,int> count; for(int i=0;i<2e5+1000;++i)mex.emplace(i); for(int i=0;i<N;++i){ cin>>A[i]; mex.erase(A[i]); count[A[i]]++; } int loopEndIdx=0; int first = -1; for(int i=N;i<N*20;++i) { A.emplace_back(*mex.begin()); count[*mex.begin()]++; if(*mex.begin()==first) { loopEndIdx = i; break; } if(i==N)first=*mex.begin(); mex.erase(mex.begin()); count[A[i-N]]--; if(count[A[i-N]]==0) { mex.emplace(A[i-N]); } } int loopLen = loopEndIdx - N; /* for(int i:A)cout << i << ' '; cout << endl; cout << "loopLen " << loopLen << endl; */ if(--X < N) { cout << A[X] << endl; return 0; } X -= N; cout << A[X%loopLen + N] << endl; /* for(int i=N;i<=N*20;++i) { int res = 0; for(int j=0;j<200;++j) { if(count[j]==0) { res = j; break; } } count[res]++; A.emplace_back(res); count[A[i-N]]--; } for(int i=0;i<100;++i) cout<<A[i] << ' '; */ }