E - Mex and Update (找序列中最小的没有出现过的非负整数 用set方法)

题目: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;	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值