2020牛客暑期多校训练营(第三场)E Two Matchings

2 篇文章 0 订阅

E Two Matchings
给一个序列 a i a_i ai
要找到两种完全不同的两两匹配,使得所有两两匹配的差的和最小,输出这个和。

比赛的时候觉得是一个二分图最小权值环,但是点太多,没法用完全图最小费用流做。(HDU 1853

做出此题需要找到四个特性:

  • 1、此题等价于找一些长度为偶数的环使得这些环恰通过每个点一次, 且所有边的总权重最少。

  • 2、 2k 个点所构成的环的权重和的最小值为最大的权重减最小的权重。

  • 3、先把所有点的按照权重排序,最佳解一定是出现在每个环都是由排
    序后连续的点构成。

  • 4、若某个环长度 ≥ 8,总是可以拆成一些长度为 4 或 6 的环且总边 权更小。
    如果没观察到规律4,可以直接dp找最小值,类似斜率优化一下就可以 O ( n ) O(n) O(n)了。

for(int i=6; i<=n; i+=2) {
    f[i] = f[l] + (a[i] - a[l+1]) * 2;
            if(f[i-2] - a[i-1] * 2 < tmp) {
                l = i - 2;
                tmp = f[i-2] - a[i-1] * 2;
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值