zoukankan      html  css  js  c++  java
  • P3644

    Portal

    首先注意到家和办公室在河同侧的是方案唯一的(就直接走),先算到答案里面去。然后剩下来的都是被分在两岸的。

    显然两岸哪个是家哪个是办公室不重要。我们设它们的位置为 (lleq r)。于是如果通过的桥为 (a),不难列出走的路程的式子 (|l-a|+|r-a|+1)(我当时就是没想到把式子列出来,进一步通过 (+) 号拆成两个独立的元素,而想着以家、办公室的对为最小元素做,这显然是麻烦的),其中这个 (1) 也可以预处理掉,剩下两个绝对值之和。

    (m) 分类:

    1. (m=1)。这个其实简单至极,就算不列式也可以轻松做。不过我们已经把式子列出来了,那就照这个思路做吧。我们设这条唯一的桥为 (a),那么答案就是 (sum(|l_i-a|+|r_i-a|)),不难发现 (sum) 后面的两项也是独立的(这是本题的关键),于是拆开,拆成 (2n)(|x-a|) 的和。那么根据初一数学我们知道 (a)(x) 的中位数的时候最优;

    2. (m=2)。依然沿用上面的思路,只不过对于桥 (a<b) 每个人可以有两种决策(目前为止还不能拆开,因为家和办公室的决策必须相同)。我们考虑对 (l,r)(a)(b) 哪个更优呢?分成四类((l)(a) 的关系、(r)(b) 的关系)不难列出条件式:(l) 更优当且仅当 (l-aleq b-r)。移项得 (l+rleq a+b)。这样子就是一个关于 (l_i+r_i) 的不等式。于是又有了一个结论:按 (l+r) 排序后,选左边桥的一定是个前缀,于是选右边桥的是后缀。于是我们考虑惯用套路:枚举这个断点。

      断点两边显然是独立的。对于每边,这时候可以将绝对值拆开了,归约到了 (m=1) 的时候。于是现在问题就是如何快速求出每个前缀的中位数(又暴露了 APIO 的毒瘤 DS 本质)。显然要从左往右依次加入数。那么维护这个傻子都能想到平衡树,但是 hb 沥尽心血教我们如何不用平衡树、线段树等数据结构,我们也不能辜负他的期望。这个插入数、查 xth 显然离散化然后值域 BIT 倍增也可以。还有一种更简便的方法:维护左右两半的 set,每次插入后调整一下左右两边的相对单调性,然后微调一下两边的元素个数平衡即可,这个还是挺自然的。

    code

  • 相关阅读:
    vue前端使用JsonViewer进行json展示
    vue代理服务器proxy配置
    'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    Python中的高阶函数和内置高阶函数(abs,map,reduce,sorted,filter)
    Ant Design Vue 通过v-decorator实现数据绑定
    Vue脚手架(vue-cli)搭建和目录结构详解
    如何使用Postman从XML提取变量
    【已解决】Vue格式化js自动加上冒号和分号
    vue.js安装与搭建
    Python函数中如何返回多个值?
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-p3644.html
Copyright © 2011-2022 走看看