AT_abc366_C 题解

题意:

题目要求支持三种操作,插入一个元素,删除一个元素,和查询某元素还剩几个,其中保证要求删除的元素至少存在一个。

做法:

开一个桶就行,这里用的是 map 。

每次插入 \(x\) 就在键 \(x\) 的位置上加 \(1\) 。

每次删除 \(x\) 就在键 \(x\) 的位置上减 \(1\) 。

需要注意的是,若是一个数的值被删成 \(0\) ,那么这个键值对还是存在于 map 里的,需要手动删除(真正的干掉)。

由于 map 太慢,所以一开始我打的时候就是用的 unordered_map 。这玩意可是要比 map 快好多倍,而且和 map 的操作基本一致,所以放心用就可以了。

代码:

#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
int n,op,x;
unordered_map<int,int>mp;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n;
	while(n--){
		cin>>op;
		if(op==1){
			cin>>x;
			mp[x]++;
		}
		if(op==2){
			cin>>x;
			mp[x]--;
			if(!mp[x])mp.erase(x);
		}
		if(op==3){
			cout<<mp.size()<<"\n";
		}
	}
	return 0;
}
posted @ 2026-10-24 21:26  SgtTree  阅读(3)  评论(0)    收藏  举报