openjudge 第九周A:List新解(vector 实现)

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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值