http://noi.openjudge.cn_3.9数据结构之C++STL_3339:List

题目

3339:List
查看提交统计提问
总时间限制: 4000ms 内存限制: 65536kB
描述
写一个程序完成以下命令:
new id ——新建一个指定编号为id的序列(id < 10000)
add id num——向编号为id的序列加入整数
num merge id1 id2——如果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

1 2 3 4

list序列容器(基于双向链表)完成

#include
#include
#include
#include
using namespace std;
int n,id1,id2;
string s;
listlit[10001];
/* C++ 标准模板库(STL)中的一种序列容器。它是一个双向链表,
这意味着每个节点(元素)除了存储数据本身外,还包含指向前一个节点和后一个节点的指针。
这种数据结构使得在序列中的任何位置进行插入和删除操作都非常高效,时间复杂度为常数时间,
因为它不需要像vector那样移动大量元素来腾出空间或者填补空缺。*/
int main(){
freopen(“data.cpp”,“r”,stdin);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;//cout<<s<<“:\n”;
if(s==“new”) cin>>id1;
else if(s==“add”)
{
cin>>id1>>id2;
lit[id1].push_back(id2);//list[id1]后面插入元素id2
}
else if(s==“merge”)
{
cin>>id1>>id2;
lit[id1].merge(lit[id2]);//讲list[id2]接到list[id1]后面,同时清空list[id2]
}
else if(s==“unique”)
{
cin>>id1;
lit[id1].sort();//排序
lit[id1].unique();//去重,unique只能去重相邻元素,所以用前先排序
}
else//输出
{
cin>>id1;
if(!lit[id1].empty())//首先判断非空
{
lit[id1].sort();//排序
ostream_iterator output(cout," ");
copy(lit[id1].begin(),lit[id1].end(),output);//输出,并以空格分隔
cout<<endl;
}else cout<<endl;
//cout<<“输出结束\n”;
}
}
}

用vector动态数组容器完成

#include <bits/stdc++.h>
using namespace std;
/*
new id ——新建一个指定编号为id的序列(id < 10000)
add id num——向编号为id的序列加入整数
merge id1 id2——如果id1等于id2,不做任何事,否则归并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
*/
vector v[200010];
int n,x1,x2;
string opx;
int main(){
//freopen(“data.cpp”,“r”,stdin);
cin>>n;
for(int i=1;i<=n;i++){
cin>>opx;
if(opx==“new”)cin>>x1;
else if(opx==“add”){
cin>>x1>>x2;
v[x1].insert(v[x1].end(),x2);
}else if(opx= =“merge”){
cin>>x1>>x2;
if(x1= =x2)continue;
for(vector::iterator it=v[x2].begin();it!=v[x2].end();it++){
v[x1].insert(v[x1].end(),*it);
}//合并
v[x2].clear();//清空
}else if(opx= =“unique”){
cin>>x1;
//if(v[x1].empty())continue; //有可能是空,就是空==空
sort(v[x1].begin(),v[x1].end());
for(vector::iterator it=v[x1].begin();it!=v[x1].end()-1&&it!=v[x1].end(); )
if(it= =(it+1))v[x1].erase(it);
else it++;
}else{ //if(opx= =“out”)
cin>>x1;
if(v[x1].empty()){cout<<endl;continue;}
sort(v[x1].begin(),v[x1].end());//该处是我一直错的原因(没仔细审题)
for(vector::iterator it=v[x1].begin();it!=v[x1].end();it++)
cout<<*it<<" ";
cout<<endl;
}
}
return 0;
}

小结

1.仔细审题,错了就从问题里找
2.积极了解各标准模板库,可以接触到不同的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值