abc 302

abc 302

E Isolation

  • 别忘了 set 有 \(O(log n)\) 的 erase 函数, 别去看什么 vector \(O(1)\) 删除
  • 其他没啥, 暴力做就行(均摊 \(O(nlogn)\)

F Merge Set

  • 非常有意思的一道题
  • 题意: 每次合并两个有交集的集合, 直到 1 和 M 在同一个集合中, 求最小步数
  • 直接贪心不行, 我们发现能合并的两个集合特征很明显(有交集), 且代价为 1, 可以直接建边跑最短路
    • 将所有包含 1 的集合编号作为起点, 包含 M 的作为终点
    • 如果集合 k 含有元素 a 就从 k 向 a (此处 a 的编号为 a + n, 防止与集合编号冲突)连一条权值为 1 的边, 从 a 向 k 连一条权值为 0 的边
      • 边权反过来也行, 但是不能两个都是 1, 否则会重复加(其实边权都设成 1 然后答案除以 2 也行)
    • 然后 Dijkstra 就行

G Sort from 1 to 4

  • 很特殊的一点: 题目中的数集是 1 - 4, 超级小
  • 设原序列为 a, 最终的(升序)为 b
  • 交换的位置一定构成一个环
  • 开始分类讨论
    • 如果 \(a_i == b_j \&\& a_j == b_i\) 那么直接交换 \(i, j\) 是最优的(1 次操作)
    • 否则, 如果\(a_i == b_j \&\& a_j == b_k \&\& a_k == b_i\) 那么交换 \(i, j, k\) 是除 1 之外最优的(2 次操作)
    • 再否则, 如果\(a_i == b_j \&\& a_j == b_k \&\& a_k == b_l \&\& a_l == b_i\) 那么除了交换 \(i, j, k, l\) 外别无选择(3 次操作)
    • 因为只有 4 个不同的数, 所以最多构成一个四元环, 不会再有其他情况了
  • 枚举每一种情况即可

Ex Ball Collector

  • Trick

    • 如果将 \(a_i, b_i\) 连边, 将构成一棵树或者一个连通图(边代表一个点 i)

    • 对于一棵 k 个节点的树, 最多可以选出 k - 1 个不同的球

    • 对于一个 k 个节点的图, 最多可以选出 k 个不同的球

  • 所以只要在 Dfs 时维护形成的树和图的个数即可, 用到可撤销并查集

  • 过程挺麻烦,略了

posted @ 2024-03-27 21:12  Bubble_e  阅读(3)  评论(0编辑  收藏  举报