刷题集(1)
题目详情
该题就是一个纯set(multiset)判断题只需按着题目的指令做就能AC,下面是set(multiset)科普
整数集合操作思路
问题分析:
实现一个支持重复元素的整数集合,处理三种操作:add(添加)、del(删除)、ask(查询),并按要求输出结果。
数据结构选择:
- 1.
multiset<int> s:
- •
存储当前集合中的所有元素(允许重复)
- •
支持快速插入、删除和计数操作
- •
- 2.
set<int> s2:
- •
存储所有曾经加入过的元素(不重复)
- •
用于记录某个元素是否曾经被加入过
- •
操作实现逻辑:
1. add x 操作:
s.insert(x); // 将x加入当前集合
s2.insert(x); // 记录x曾经被加入过(set自动去重)
cout<<s.count(x)<<endl; // 输出操作后x的个数
2. del x 操作:
cout<<s.count(x)<<endl; // 先输出删除前x的个数
s.erase(x); // 删除所有等于x的元素
3. ask x 操作:
if(s2.find(x)!=s2.end()) // 检查x是否曾经加入过cout<<1<<" "<<s.count(x)<<endl; // 曾加入:输出1和当前个数
elsecout<<0<<" "<<s.count(x)<<endl; // 未加入:输出0和当前个数
算法特点:
- •
时间复杂度:add O(logn),del O(k+logn),ask O(logn)
- •
空间复杂度:O(n)
- •
利用STL特性:multiset自动排序且允许重复,set自动去重
正确性保证:
- 1.
add操作:同时维护当前集合和历史记录
- 2.
del操作:先输出数量再执行删除
- 3.
ask操作:分别查询历史记录和当前状态
这个实现完美符合题目要求,利用STL容器高效地完成了所有操作。
代码样例
#include<bits/stdc++.h>//注释在上文,这里不打
using namespace std;
multiset <int> s;
set <int>s2;//存储是否曾经加入过这个数
int main()
{int k,x;string op;cin>>k;while(k--){cin>>op>>x;if(op=="add"){s.insert(x);s2.insert(x);cout<<s.count(x)<<endl;}if(op=="del"){cout<<s.count(x)<<endl;s.erase(x);}if(op=="ask"){if(s2.find(x)!=s2.end()){cout<<1<<" "<<s.count(x)<<endl;}else{cout<<0<<" "<<s.count(x)<<endl;}}}return 0;
}
此代码仅供参考,请勿纯抄