zoukankan      html  css  js  c++  java
  • DUT Star Weekly Contest #3 Problem F Solution

    题目链接

    问题转化

    $$a_i+a_j+(i-j)^2=a_i+i^2+a_j+j^2-2ij$$

    令 $b_i=a_i+i^2$ , 问题化为: 求

    $$max {b_i+b_j-2ij},quad (1 le i, j le n, i e j).$$

    固定 $i$ , 不妨设 $j<i$ , 定义函数

    egin{equation}
    F_i(j) = b_j-2ij,quad (1 le j< i)
    end{equation}

    问题化成: 求

    egin{equation}
    OPT_i = max{F_i(j)}.
    label{OPT}
    end{equation}

    设 $ k < j < i $ , 我们来推导取 $j$ 优于 $k$ 的条件:

    [ b_j - 2 i j > b_k-2ik Longrightarrow (b_j-b_k) > 2i(j-k) ]


    egin{equation}
    dfrac{b_j - b_k}{j-k} > 2i
    label{C}
    end{equation}

    将 eqref{C} 式左边记作 $g(k, j)$ , 右边记作 $f(i)$ , 对于 $OPT_i$ 而言, $j$ 优于 $k$ 的条件为:

    egin{equation}
    g(k,j) > f(i) label{general_C}
    end{equation}

    考虑一平面点集 $P = { p_i: (i, b_i) }, 1 le i le n$, 则 $g(k, j)$ 表示斜率, 显然有
    $$ g(j, k) = g(k, j) $$

    斜率单调性优化

    为了快速求 $OPT_i$, 借助 $eqref{general_C}$ , 我们研究一下哪些 $j (1 le j < i)$ 可能是 $OPT_i$ 的唯一解. 有如下结论:

    设 $j_1 < j_2 < j_3 $ ,
    $g(j_1, j_2) le g(j_2, j_3) implies forall i > j_3, quad j_2$ 不优于 $j_1$ 或者 $j_2$ 不优于 $j_3$

    证明:

    $forall i > j_3$,
    若 $j_2$ 优于 $j_3$ 即 $g(j_2, j_3)<f(i)$, 则 $g(j_1, j_2) le g(j_2, j_3) < f(i)$ 即 $j_1$ 优于 $j_2$
    若 $j_2$ 优于 $j_1$ 即 $g(j_1, j_2)>f(i)$, 则 $g(j_2, j_3) ge g(j_1, j_2) > f(i)$ 即 $j_3$ 优于 $j_2$

    根据这个结论, 为了求解 $OPT_i$, 可以维护一个点的队列使得

    1. 相邻两点的斜率严格递减.
    2. 任意相邻两点的斜率都满足 eqref{general_C} 式

    这样队尾的点即为最优.

    由 $n$ 个点构造这样的一个队列的复杂度是 $O(n)$. 另外, 可以令队列中的点只满足上述条件1, 然后从后向前遍历或者二分寻找「与前一个点斜率仍满足 $eqref{general_C}$ 式的最末的那个点」.

    然而我们并不能对每个 $OPT_i$ 都从头求一遍, 那样复杂度和暴力一样. 对于一般情况, 我们可以动态维护一个斜率严格递减的队列, 在上面二分求解, 复杂度是 $O(nlog n)$ . 当 $f(i)$ 单调时, 复杂度可以做到 $O(n)$ :

    1. $f(i)$ 递增: 在斜率单调递减的基础上, 每次在求解 $OPT_i$ 之前, 若队尾点满足 $g(j_1, j_2) le f(i)$ , 则队尾点出队, 反复该操作. 用队尾元素计算DP值.
    2. $f(i)$ 递减: 在斜率单调递减的基础上, 每次在求解 $OPT_i$ 之前, 若队首点符合 $g(j_1, j_2) ge f(i)$ , 则队首点出队, 反复该操作. 用队首元素计算DP值.

    这一步可以称作 EXPOSING, 很形象, 它的目的正是将最优的转移点暴露出来.

    总结

    形如

    egin{equation}
    g(k,j) lessgtr f(i)
    label{condition}
    end{equation}

    , 左边 $g(k,j)$ 是某种斜率的形式, 都可以通过维护斜率单调的队列来优化. 一般情况下, 复杂度可优化到 $O(nlog n)$ , 当 $f(i)$ 单调时, 复杂度可进一步优化到 $O(n)$ :

    1. 形如 $g(k,j)>f(i)$ , 维护一个相邻点斜率严格递减的点列.
    2. 形如 $g(k,j)<f(i)$ , 维护一个相邻点斜率严格递增的点列.

    例题

    CF1083E

  • 相关阅读:
    appium在Mac上环境搭建
    判断元素的16中方法expected_conditions
    python3条件表达式和字符串
    webdriver的API
    什么是web接口
    python2函数
    python1变量,表达式和语句
    XPath学习
    接口相关概念
    解决jdk1.7,1.8共存问题小思
  • 原文地址:https://www.cnblogs.com/Patt/p/6132081.html
Copyright © 2011-2022 走看看