萌新求调,,ԾㅂԾ,,

题目:普及1课内 DS+STL - 信友队

题面:

现在有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各输出一行表示答案

样例输入
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
样例输出
1
No
0
No
数据范围
n=100000,集合编号小于10,数字小于等于100000

时空限制
1s,512M

我的代码:

#include<bits/stdc++.h>
using namespace std;
int n,x,y,a;
set<int>s[15];
set<int>sw;
int main(){
	cin>>n;
	while(n--){
		cin>>a;
		if(a==6){
			cin>>x;
			cout<<s[x].size()<<'\n';
		}
		else{
			cin>>x>>y;
			if(a==1)s[x].insert(y);
			else if(a==2){
				if(s[x].count(y)!=0){
					set<int>::iterator it=s[x].find(y);
					s[x].erase(it);
				}
			}
			else if(a==3){
				for(set<int>::iterator it=s[y].begin();it!=s[y].end();it++)s[x].insert(*it);
				s[y].clear();
			}
			else if(a==4){
				sw.clear();
				for(set<int>::iterator it=s[x].begin();it!=s[x].end();it++)sw.insert(*it);
				for(auto it:s[x])if(s[y].count(it))sw.insert(it);
				s[y].clear();
				s[x]=sw;
			}
			else{
				if(s[x].count(y))puts("Yes");
				else puts("No");
			}
		}
	}
	return 0;
}

WA 爆0

dalao 求调!

1 个赞

@王建力 @钱与辰 @2345安全卫士 求条QAQ

1 个赞

@王钰宸涵
s[x]的iterator不能给sw用
https://discourse.xinyoudui.com/t/topic/30087/6?u=%E6%9B%BE%E5%A4%A9%E4%BA%91

2 个赞

@曾天云 我没有给 sws[x]iterator 呀?

1 个赞
for(set<int>::iterator it=s[x].begin();it!=s[x].end();it++)if(s[y].count(*it)==0&&!sw.empty())sw.erase(it);

it是s【x】的你sw.erase(it)

2 个赞

o,谢谢(傻了,想的是 sw 写成 s[x]

1 个赞

改了,还是RE呀QAQ

1 个赞

咋改的
成啥了?

2 个赞

应该是STl容器越界

1 个赞

成啥了

2 个赞
#include<bits/stdc++.h>
using namespace std;
int n,x,y,a;
set<int>s[15];
set<int>sw;
int main(){
	cin>>n;
	while(n--){
		cin>>a;
		if(a==6){
			cin>>x;
			cout<<s[x].size()<<'\n';
		}
		else{
			cin>>x>>y;
			if(a==1)s[x].insert(y);
			else if(a==2){
				if(s[x].count(y)!=0){
					set<int>::iterator it=s[x].find(y);
					s[x].erase(it);
				}
			}
			else if(a==3){
				for(set<int>::iterator it=s[y].begin();it!=s[y].end();it++)s[x].insert(*it);
				s[y].clear();
			}
			else if(a==4){
				sw.clear();
				for(set<int>::iterator it=s[x].begin();it!=s[x].end();it++)sw.insert(*it);
				for(set<int>::iterator it=sw.begin();it!=sw.end();it++)if(s[y].count(*it)==0&&!sw.empty())sw.erase(it);
				s[y].clear();
				s[x].clear();
				for(set<int>::iterator it=sw.begin();it!=sw.end();it++)s[x].insert(*it);
			}
			else{
				if(s[x].count(y))puts("Yes");
				else puts("No");
			}
		}
	}
	return 0;
}
1 个赞

1.for(set<int>::iterator it=sw.begin();it!=sw.end();it++)s[x].insert(*it);s[x]=tmp;
2.for(auto i:s[x])if(s[y].count(i))sw.push(i);

2 个赞

?什么意思

1 个赞

在sw。erase(it)后it无效了

2 个赞

所以不能边遍历边删除

1 个赞
else if(a==4){
	sw.clear();
	for(auto it:x)if(a[y].count(it))sw.insert(it);
	s[x]=sw;
	s[y].clear();
}
2 个赞

集合可以赋值呀

1 个赞

最后要先s【x】=sw再s【y】。clear()

当然,同种的类型均可

struct t{
......
}a,b;
int main(){
    a=b;
}
2 个赞

上课没讲呀

1 个赞