1 条题解
-
0
F. 匹配交友 详细题解
题目核心理解
给定 个活动集合 ,你需要找到一对用户 ,满足以下三个条件:
- (两人有共同爱好)
- ( 有 没有的爱好)
- ( 有 没有的爱好)
如果存在这样的一对,输出
YES并给出任意一组编号;否则输出NO。
核心思路
1. 关键性质
- 一对用户不是良好匹配,当且仅当: 要么集合不相交,要么一个完全包含另一个。
- 如果不存在任何良好匹配,那么所有集合可以排成一棵包含树: 祖先节点的集合一定包含后代节点的集合。
2. 构造与检验规则
- 把集合按大小从大到小排序。
- 依次为每个集合找一个已处理过、有交集的集合作为父亲。
- 若当前集合不被父亲包含,则这一对就是答案。
- 若同一父亲下的两个孩子有公共活动,则这两个孩子就是答案。
- 全程无矛盾,则输出
NO。
算法流程
- 将所有用户按爱好数量降序排序。
- 遍历每个用户,为其寻找一个有共同活动的已处理用户作为父亲。
- 对当前用户 和父亲 :
- 若 不完全包含在 中,直接输出 和 。
- 检查同一父亲下的其他子节点:
- 若有与当前用户共享活动的兄弟节点,直接输出这对兄弟。
- 遍历结束未找到,输出
NO。
公式与复杂度分析
良好匹配条件:
$$S_a\cap S_b \neq \emptyset,\quad S_a\setminus S_b \neq \emptyset,\quad S_b\setminus S_a \neq \emptyset $$复杂度
- 排序:
- 遍历与检查:
- 总时间复杂度:
可轻松处理 、 的数据范围,在 秒时限内稳定通过。
- 1
信息
- ID
- 6588
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者