玄关!站外题!样例通过!求调(马蜂良好)!急!
查看原帖
玄关!站外题!样例通过!求调(马蜂良好)!急!
739307
All_Failed_OI_Cici楼主2024/11/2 19:32
题目描述
现在有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

code

#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代码检查未果)

2024/11/2 19:32
加载中...