总时间限制:
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
提示
Please use STL’s set and multiset to finish the task
#include <bits/stdc++.h>//Writed by Wangzhimin Date:2022.05.18
int n, m;//n中存要放的命令数,m是一个加或是删除的或是查的数
char s[5];//命令
using namespace std;
int main()
{
scanf("%d",&n);//命令数
multiset<int> st;//操作的
multiset<int> st1;//原来的
multiset<int>::iterator sp;//迭代器
while(n--){
scanf("%s %d",&s,&m);//命令与数
int sum=0;
switch(s[1]){//命令的第二个字母
case 'd'://加入
st.insert(m);
st1.insert(m);
sp=st.lower_bound(m);//查找
while(*sp==m&&sp!=st.end()){
sum++;
sp++;
}
cout<<sum<<endl;//输出
break;
case 'e':
sp=st.lower_bound(m);//准备删除数
while(*sp==m&&sp!=st.end()){
sum++;
sp++;
}
cout<<sum<<endl;//输出
st.erase(m);//删除
break;
case 's':
sp=st1.find(m);//查找
if(sp==st1.end())//没找到
cout<<"0"<<" "<<"0"<<endl;
else{//找到了
cout<<"1"<<" ";
sp=st.lower_bound(m);//有几个
while(*sp==m&&sp!=st.end()){
sum++;
sp++;
}
cout<<sum<<endl;//输出
}
break;
}
}
return 0;
}