写一个程序完成以下命令: new id ——新建一个指定编号为id的序列(id<10000) add id num——向编号为id的序列加入整数num merge id1 id2——合并序列id1和id2中的数,并将id2清空 unique id——去掉序列id中重复的元素 out id ——从小到大输出编号为id的序列中的元素,以空格隔开 提示:1)使用map<int,list<int> >结构。2)可能用到的算法:insert,sort,merge,unique。 输入 第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。 输出 按题目要求输出。 Sample Input: 16 new 1 new 2 add 1 1 add 1 2 add 1 3 add 2 1 add 2 2 add 2 3 add 2 4 out 1 out 2 merge 1 2 out 1 out 2 unique 1 out 1 Sample Output: 1 2 3 1 2 3 4 1 1 2 2 3 3 4 1 2 3 4
时间: 2024-03-01 19:55:32 浏览: 93
oracle 创建id主键序列 脚本
以下是题解:
```cpp
#include <iostream>
#include <map>
#include <list>
#include <algorithm>
using namespace std;
map<int,list<int> > mp;
void new_id(int id){
mp[id]=list<int>();
}
void add(int id,int num){
mp[id].insert(lower_bound(mp[id].begin(),mp[id].end(),num),num);
}
void merge(int id1,int id2){
mp[id1].merge(mp[id2]);
mp[id2].clear();
}
void unique(int id){
mp[id].unique();
}
void out(int id){
for(list<int>::iterator it=mp[id].begin();it!=mp[id].end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
int main(){
int n;
cin>>n;
while(n--){
string op;
cin>>op;
if(op=="new"){
int id;
cin>>id;
new_id(id);
}
else if(op=="add"){
int id,num;
cin>>id>>num;
add(id,num);
}
else if(op=="merge"){
int id1,id2;
cin>>id1>>id2;
merge(id1,id2);
}
else if(op=="unique"){
int id;
cin>>id;
unique(id);
}
else if(op=="out"){
int id;
cin>>id;
out(id);
}
}
return 0;
}
```
思路:
使用 map<int,list<int> > 结构来存储每个序列。其中,map 中的键为序列的编号,值为该序列中的元素(使用 list 存储)。对于每个命令,根据命令类型调用相应的函数进行处理即可。
细节:
- 在 add 函数中,使用 lower_bound 函数找到插入位置,保证了序列中的元素从小到大排列。
- 在 merge 函数中,使用 merge 函数将两个序列合并,使用 clear 函数将被合并的序列清空。
- 在 unique 函数中,使用 unique 函数将序列中的重复元素去掉。
时间复杂度:$O(n\log n)$(其中 $n$ 为操作数)
空间复杂度:$O(n)$
完整代码:
阅读全文