题目描述
现在有10个集合(元素不可重),编号为0~9,现在有6种操作:
给一个集合x插入一个数y。
给一个集合x删除一个数y(如果没有就不删)。
给两个集合x,y,将集合x=x∪y(集合求并集),并将y清空。
给两个集合x,y,将集合x=x∩y(集合求交集),并将y清空。
给一个集合x和一个数y,询问集合x中是否出现了y。
给一个集合x,问集合x中有多少个数。
不保证所有数不相同。
注意操作3与操作4:当x=y时,操作后将y清空,由于x=y,所以集合x是空集。
输入描述
输入一个n,表示接下来有n次操作,
接下来n行每行一个数op,
若op=1~5,则之后再跟两个数x,y。
若op=6,则之后再跟一个数x。
输出描述
对于每个操作5,6各输出一行表示答案
input
15
1 3 62201
4 1 4
6 3
2 4 42881
2 9 90161
5 4 11649
3 8 3
4 9 5
1 6 54033
6 0
2 3 60171
1 7 84681
3 5 4
1 1 98337
5 0 24497
output
1
No
0
No
数据范围
n=100000,集合编号小于10,数字小于等于100000
时空限制
1s,512M
#include<bits/stdc++.h>
using namespace std;
set<int> s[15];
int op,n,x,y;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
while(n--){
cin>>op;
set<int>::iterator it;
switch(op){
case 1:
cin>>x>>y;
s[x].insert(y);
break;
case 2:
cin>>x>>y;
if(s[x].count(y)) s[x].erase(y);
break;
case 3:
cin>>x>>y;
s[x].insert(s[y].begin(),s[y].end());
s[y].clear();
break;
case 4:
cin>>x>>y;
for(it=s[x].begin();it!=s[x].end();it++){
if(s[y].count((*it))) s[12].insert((*it));
}
s[x].clear(),s[y].clear();
s[x]=s[12];
s[12].clear();
break;
case 5:
cin>>x>>y;
if(s[x].count(y)) cout<<"Yes\n";
else cout<<"No\n";
break;
case 6:
cin>>x;
cout<<s[x].size()<<endl;
break;
}
}
return 0;
}
(老师对着他的AC代码检查未果)