题目:https://atcoder.jp/contests/abc330/tasks/abc330_e
思想:用set存所有没有出现过的值,用 c 存下原来的值,修改后,c 的个数减一,如果 c 的个数变为 0 ,则 set 里面要加入 c 元素,同时 修改后的值 x 的值要加一,并且在set里面找到之前是否有 x 元素,如果有就删除,最后输出 set 的第一个元素即为最小的没有出现过的非负整数。
注:判断set里面是否有这个函数,没有返回 set.end(),所以只要判断 !set.end() 即可,
set只能返回迭代器,所以输出的时候要加上 *
代码:
// Problem: E - Mex and Update
// Contest: AtCoder - TOYOTA SYSTEMS Programming Contest 2023(AtCoder Beginner Contest 330)
// URL: https://atcoder.jp/contests/abc330/tasks/abc330_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
const int inf = 0x3f3f3f3f;
int n,q;
int a[N];
int k,x;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>q;
map<int,int> mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
}
set<int> se;
for(int i=0;i<=n*2;i++){
if(!mp[i]){
se.insert(i);
}
}
while(q--){
int k,x;
cin>>k>>x;
int c=a[k]; //原来的值
a[k]=x;
mp[c]--;
if(!mp[c]){
se.insert(c);
}
mp[x]++;
if(se.find(x)!=se.end()){
se.erase(x);
}
cout<<*se.begin()<<"\n";
}
return 0;
}