题目分析:
判断是否存在两个集合,使这两个集合的交集不为空,并且一个当中的某些元素也在另一个当中出现过。
算法分析:
首先来看暴力:很容易想到根据题目所给的信息来枚举,每次判断两个集合是否能满足条件。期望得分:40。
然后来看正解:容易发现,如果按照所给集合的大小从大到小排序,那么前一个集合一定不会是后一个集合的真子集。这时可以用染色法来求解。
考虑某一个集合,把它能到的点(也就是这个人会做的题的编号)给染成一种颜色,一层一层往下覆盖。
那么怎么求答案呢?考虑某一个集合,如果这个集合能覆盖到两种颜色,那么必然说明该集合和某一个覆盖这两种颜色之一的集合是答案。但是具体是哪一个呢?肯定是覆盖的颜色小的那一个集合喽(不明白的话代码里有详解)。
但是,就差最后一步了!如果某一个集合覆盖的点颜色为0的话,那么就输出这个集合。
代码+注释详解
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#define re register
usin