C++Description Write a program to complete the following command: new id - create a specified sequence of Numbers for id (id < 200000) Add id num - to join the sequence of Numbers for id integer num merge id1 id2 - merger sequence number of id1 and id2, and make id2 empty unique id - remove repetitive element in the sequence id out id - from small to large, output the elements of sequence of Numbers for ids separated by Spaces Input The First Line is n which mean the number of the Command (n <= 200000). The next n lines are correct Command. You don't have to worry wrong input and id is int. Output Then output according the requirements. 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 Ouput 1 2 3 1 2 3 4 1 1 2 2 3 3 4 1 2 3 4 1 2 3 1 2 3 4 1 1 2 2 3 3 4 1 2 3 4
时间: 2024-01-05 11:03:06 浏览: 158
以下是 C++ 代码实现,包含注释说明:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <unordered_set>
#include <map>
using namespace std;
// 存储每个序列的数据结构
map<int, vector<int>> seqs;
// 存储每个序列中出现的数字以及出现次数的数据结构
map<int, unordered_set<int>> freqs;
// 创建一个新的序列
void newSeq(int id) {
if (seqs.count(id) == 0) {
seqs[id] = vector<int>();
freqs[id] = unordered_set<int>();
}
}
// 添加数字到指定序列
void addNum(int id, int num) {
seqs[id].push_back(num);
freqs[id].insert(num);
}
// 合并两个序列
void mergeSeq(int id1, int id2) {
if (seqs.count(id1) == 0 || seqs.count(id2) == 0) {
return;
}
vector<int> &seq1 = seqs[id1], &seq2 = seqs[id2];
// 把 id1 序列的元素添加到 id2 序列末尾
seq2.insert(seq2.end(), seq1.begin(), seq1.end());
// 更新 id2 序列中数字出现次数的数据结构
for (int num : seq1) {
freqs[id2].insert(num);
}
// 清空 id1 序列
seqs.erase(id1);
freqs.erase(id1);
}
// 输出指定序列的数字,从小到大排序
void outputSeq(int id) {
if (seqs.count(id) == 0) {
return;
}
vector<int> &seq = seqs[id];
// 使用 set 自动去重和排序
set<int> nums;
for (int num : seq) {
nums.insert(num);
}
for (int num : nums) {
cout << num << " ";
}
cout << endl;
}
// 删除指定序列中的重复数字
void uniqueSeq(int id) {
if (seqs.count(id) == 0) {
return;
}
vector<int> &seq = seqs[id];
// 使用 unordered_set 记录每个数字出现的次数
unordered_map<int, int> freq;
for (int num : seq) {
freq[num]++;
}
// 清空序列
seq.clear();
// 把出现次数为 1 的数字重新插入到序列中
for (int num : freqs[id]) {
if (freq[num] == 1) {
seq.push_back(num);
}
}
}
int main() {
int n;
cin >> n;
while (n--) {
string op;
cin >> op;
if (op == "new") {
int id;
cin >> id;
newSeq(id);
} else if (op == "add") {
int id, num;
cin >> id >> num;
addNum(id, num);
} else if (op == "merge") {
int id1, id2;
cin >> id1 >> id2;
mergeSeq(id1, id2);
} else if (op == "out") {
int id;
cin >> id;
outputSeq(id);
} else if (op == "unique") {
int id;
cin >> id;
uniqueSeq(id);
}
}
return 0;
}
```
时间复杂度分析:
- 创建新序列和添加数字操作的时间复杂度均为 O(1)。
- 合并序列操作需要将一个序列中的所有元素添加到另一个序列中,时间复杂度为 O(n),其中 n 是序列长度。
- 输出序列操作需要先将序列中的元素去重和排序,时间复杂度为 O(nlogn),其中 n 是序列长度。
- 删除序列中的重复数字操作需要先统计每个数字出现的次数,时间复杂度为 O(n),其中 n 是序列长度。
因此,总的时间复杂度为 O(nlogn)。
阅读全文