跳转至

语言月赛 202410 同桌

题目分析

  • 有 $2n$ 个小朋友,编号 $1$ 到 $2n$;
  • $n$ 张桌子,每张桌坐 $2$ 人;
  • 每个小朋友 $i$ 希望和 $p_i$ 做同桌;
  • 要判断是否存在一种配对,使得每对同桌 $(i, j)$ 满足:
  • $p_i = j$ 且 $p_j = i$;
  • 同桌不能是自己。

解题思路

  • 将问题转化为检查每个同桌关系是否互相匹配;
  • 遍历每个小朋友 $i$,检查:
    • $p_i \neq i$,自己不能是同桌;
    • $p_{p_i} = i$,对方也想和自己做同桌;
  • 若所有小朋友均满足上述条件,则输出 Yes,否则输出 No

处理流程

  • 读入整数 $n$;
  • 读入长度为 $2n$ 的数组 $p$;
  • 对每个 $i$ 从 $1$ 到 $2n$:
    • 如果 $p_i = i$,直接输出 No 并结束;
    • 否则判断 $p_{p_i}$ 是否等于 $i$,不等则输出 No 并结束;
      • 解析:$p_i$ 是 $i$ 希望的同桌。那么 $p_{p_i}$ 就是 $p_i$ 希望的同桌。
  • 如果全部检查通过,输出 Yes

复杂度分析

  • 时间复杂度:$O(n)$,仅需一次遍历;
  • 空间复杂度:$O(n)$,用于存储数组。

总结

  • 题目核心在于双向匹配的检查;
  • 只要每对同桌的需求是对称的,则答案是 Yes
  • 否则肯定是 No,直接排除;
  • 算法简洁且效率高,适合 $n$ 最大 $5000$ 的情况。