A:List新解(vector 实现)
查看提交统计提问
总时间限制: 4000ms 内存限制: 65536kB
描述
写一个程序完成以下命令:
new id ——新建一个指定编号为id的序列(id<10000)
add id num——向编号为id的序列加入整数num
merge id1 id2——合并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
输入
第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。
输出
按题目要求输出。
样例输入
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
样例输出
1 2 3
1 2 3 4
1 1 2 2 3 3 4
\n
1 2 3 4
注意到id数据范围较小,直接开满10000vector的数组即可,重点在于vector中的去重环节,而其中合并操作要注意id1=id2的情形,话不多说,上代码。
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
vector<int>::iterator it;
vector<int >num[10005];
int main() {
string s;
int n,id,val;
cin >> n;
while (n--) {
cin >> s;
if (s == "new") {
cin >> id;
continue; }
if (s == "add") {
cin >> id>>val;
num[id].push_back(val);
}
if (s == "out") {
cin >> id;
if (!num[id].empty()) {
sort(num[id].begin(), num[id].end());
it = num[id].begin();
cout << *it;
it++;
for (; it != num[id].end(); it++) {
cout << " " << *it;
}
}
cout << endl;
}
if (s == "unique") {
cin >> id;
sort(num[id].begin(), num[id].end());
num[id].erase(unique(num[id].begin(), num[id].end()),num[id].end());
//利用unique()本身返回逻辑结束点为起点,删去多余元素,从而实现vector去重
}
if (s == "merge") {
cin >> id >> val;
if (val != id)//此处有坑,wa了好久就是他
{
vector<int>tmp;
tmp.resize(num[id].size() + num[val].size());
merge(num[id].begin(), num[id].end(), num[val].begin(), num[val].end(), tmp.begin());
num[id].swap(tmp);
num[val].clear();
}
}
}
return 0;
}