总时间限制:
5000ms
内存限制:
100000kB
描述
现有一整数集(允许有重复元素),初始为空。我们定义如下操作:
add x 把x加入集合
del x 把集合中所有与x相等的元素删除
ask x 对集合中元素x的情况询问
对每种操作,我们要求进行如下输出。
add 输出操作后集合中x的个数
del 输出操作前集合中x的个数
ask 先输出0或1表示x是否曾被加入集合(0表示不曾加入),再输出当前集合中x的个数,中间用空格格开。
输入
第一行是一个整数n,表示命令数。0<=n<=100000。
后面n行命令,如Description中所述。
输出
共n行,每行按要求输出。
样例输入
7 add 1 add 1 ask 1 ask 2 del 2 del 1 ask 1
样例输出
1 2 1 2 0 0 0 2 1 0
multiset 类会将重复元素也计入其中,而set中没有相同元素,使用multiset中的count函数可以查询一个元素出现的次数。
erase(n)会删去multiset中所有与n相同的元素。
这道题目要查询元素是否被加入到容器,所以除了一个multiset容器外,还要使用一个set容器
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
// 这里用两个容器,是因为要查询元素是否曾加入过集合
multiset<int> mset;
set<int> mm;
char commend[5];
int i, n, num;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> commend >> num;
switch (commend[1]) // 判断命令的第二个字母
{
case 'd': // add
mset.insert(num); // 将num加入集合
mm.insert(num);
cout << mset.count(num) << endl; //输出操作后集合中x的个数
break;
case 'e': // del
cout << mset.count(num) << endl; // 输出操作前集合中x的个数
mset.erase(num); // 把集合中所有与x相等的元素删除
break;
case 's': // ask
if (mm.find(num) == mm.end())
cout << "0 0" << endl; // 先输出0或1表示x是否曾被加入集合(0表示不曾加入),
// 再输出当前集合中x的个数,中间用空格格开。
else
{
cout << "1 "; // 集合曾加入了集合
cout << mset.count(num) << endl; // 输出集合中的个数
}
break;
}
}
return 0;
}