zoukankan      html  css  js  c++  java
  • [AGC028C] Min Cost Cycle 题解


    代码

    这题首先要切换角度,对着这个哈密顿回路瞪没啥用,我们考虑转化成每一个点的贡献

    我们任意挑选可行方案出来,发现每一个点 (u) (假设 (from) 连向它,它连向 (to))的贡献只有四种情况:

    • (a_u<b_{to},b_u<a_{from}),这个点选取 (a_u)(b_u) 都计入答案。
    • (a_u<b_{to},b_u>a_{from}),这个点选取 (a_u) 都计入答案。
    • (a_u>b_{to},b_u<a_{from}),这个点选取 (b_u) 都计入答案。
    • (a_u>b_{to},b_u>a_{from}),这个点 (a_u)(b_u) 都不计入答案。

    同时满足:

    • 选取的数((a) 被选的数量与 (b) 被选的数量之和)共计 (n) 个。

    接下来我们从一个选取方案回推构图(哈密顿回路)方案。第一个想法是选取最小的 (n) 个数,但是这样是不对的,因为这样的选取方式不一定能对应一个方案。

    我们看哈密顿回路中一条边的意义,为起点的 (a) 和终点的 (b) 选取较小的那个,这里我们可以采用一个技巧,把这个条件转化为起点的 (a) 和终点的 (b) 中选取且仅选取一个

    为什么这样正确?我们观察这样造成的多出来的一系列本应该不合法方案,发现如果这条边如果取另一个数答案一定更优,也就是说这些方案虽然不合法但是一定不能成为答案,所以,无所谓啦。

    后面就简单了。

    给出结论,只有这三种方案存在对应方案:

    • 全选 (a)
    • 全选 (b)
    • 至少存在一个点 (a)(b) 都被选择

    前两种显然,不证了。

    第三种口胡一下。
    我们把左边那列视为 (a),右边那列视为 (b),选取的数为正方形,未选取的数为圆形。
    我们要连 (n) 条边,连成一个环,一条边必须连接一个取和一个不取。

    如果一部分选 (a),一部分选 (b),那么任意一个选 (a) 的点和任意一个选 (b) 的点是连不起来的,这个图不可能连通,所以不行。

    如果有 (k) 个都选,必然也有 (k) 个都不选,这里再分四种情况:

    • 全是都选或都不选

    • 都选 + 只选 (a)

    • 都选 + 只选 (b)
      和上一种本质一样。
      JYT7lV.png

    • 都选 + 只选 (a) + 只选 (b)
      JYTLmF.png

    具体做法嘛。。前两个特判,后一种枚举一个强制两个都选,剩下所有数中的贪心选取最小的 (n-2) 个,因为其它点的选择是无所谓的。

    这里先最小的 (n) 个全扔小根堆里,然后看每一个点强制双选的时候,它的 (a)(b) 有几个数是在小根堆里,记为 (k)(k) 只能是 (0)(1)(2),用 (a)(b) 中不在小根堆里的数之和加上小根堆中最小的 (n-k) 个数之和(这个可以预处理)更新答案。

  • 相关阅读:
    Android 采用HttpClient提交数据到服务器
    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.解决办法
    Android 字符乱码问题的处理
    Android 网络HTML查看器
    Android消息机制入门
    Android ANR产生的原理和如何避免
    Android 网络图片查看器
    Ubuntu下使用Git和GitHub
    定制保存top输出信息的格式详解
    linux的top命令参数详解
  • 原文地址:https://www.cnblogs.com/IltzInstallBI/p/12750308.html
Copyright © 2011-2022 走看看