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 时维护形成的树和图的个数即可, 用到可撤销并查集
-
过程挺麻烦,略了