【题目链接】
【题目考点】
1. STL multiset
多重集合,可以保存多个相同的数值。
声明对象示例:multiset<int> ms
- 插入数值v:
ms.insert(v)
- 集合中数值v的个数:
ms.count(v)
- 删除所有数值v,返回删除的元素个数:
ms.erase(v)
2. STL set
集合,相同的数值只能保存1个。
声明对象示例:set<int> st
- 插入数值v:
st.insert(v)
- 集合中数值v的个数(只能返回0或1):
ms.count(v)
- 删除数值v:
ms.erase(v)
【解题思路】
整数集中可能有重复元素,因此该整数集需要使用multiset来保存。声明对象multiset<int> ms
。
添加、删除操作直接调用insert、erase函数即可完成。注意erase函数会返回删除的元素个数。
由于ask会询问某元素是否曾加入过整数集。题中没说明数值x的范围,默认是所有int可能表示的数值,范围为
1
0
9
10^9
109,无法使用vis数组来标记某数字是否访问过。
这里可以再开一个set类型的对象,set<int> st
用来保存所有曾经加入ms中的数字。每个加入ms中的数字,也加入到st中。由于st中每个数值最多保存1个,因此x在st中的个数即表示x是否曾经加入ms(1表示曾经加入,0表示未曾加入)。
【题解代码】
解法1:STL set, multiset
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int> st;//st中保存曾经被加入集合的数字
multiset<int> ms;//表示可以保存重复数字的整数集合
string s;
int n, x;
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> s >> x;
if(s == "add")
{
st.insert(x);
ms.insert(x);
cout << ms.count(x) << endl;
}
else if(s == "del")
cout << ms.erase(x) << endl;//输出删掉x的个数
else //s == "ask"
cout << st.count(x) << ' ' << ms.count(x) << endl;
}
return 0;
}