题目链接

问题转化

\[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\}, \ (1 \le i, j \le n, i \ne j).\]

固定 \(i\) , 不妨设 \(j<i\) , 定义函数
\[
\begin{equation}
F_i(j) = b_j-2ij,\ (1 \le j< i)
\end{equation}
\]
问题化成: 求
\[
\begin{equation}
OPT_i = \max{F_i(j)}.
\label{OPT}
\end{equation}
\]

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

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


\[
\begin{equation}
\dfrac{b_j - b_k}{j-k} > 2i
\label{C}
\end{equation}
\]
将 \(\eqref{C}\) 式左边记作 \(g(k, j)\) , 右边记作 \(f(i)\) , 对于 \(OPT_i\) 而言, \(j\) 优于 \(k\) 的条件为:
\[
\begin{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)\) \(\Longrightarrow\) \(\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(n\log 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(i_1, j_2) \ge f(i)\) , 则队首点出队, 反复该操作. 用队首元素计算DP值.

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

总结

形如
\[
\begin{equation}
g(i,j) \lessgtr f(i)
\label{condition}
\end{equation}
\]
, 左边 \(g(i,j)\) 是某种斜率的形式, 都可以通过维护斜率单调的队列来优化. 一般情况下, 复杂度可优化到 \(O(n\log n)\) , 当 \(f(i)\) 单调时, 复杂度可进一步优化到 \(O(n)\) :

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

DUT Star Weekly Contest #3 Problem F Solution的更多相关文章

  1. The Ninth Hunan Collegiate Programming Contest (2013) Problem F

    Problem F Funny Car Racing There is a funny car racing in a city with n junctions and m directed roa ...

  2. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...

  3. 2019 GDUT Rating Contest II : Problem F. Teleportation

    题面: Problem F. Teleportation Input file: standard input Output file: standard output Time limit: 15 se ...

  4. Problem F Plug It In!

    题目链接:https://cn.vjudge.net/contest/245468#problem/F 大意:给你插座和电器的对应关系,有多个电器对应一个插座的情况,但是一个插座只能供一个电器使用,现 ...

  5. 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列

    Problem F. Judging Time Prediction 题目连接: http://www.codeforces.com/gym/100253 Description It is not ...

  6. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem F. Finance 模拟题

    Problem F. Finance 题目连接: http://codeforces.com/gym/100714 Description The Big Boss Company (BBC) pri ...

  7. HDU 6324.Problem F. Grab The Tree-博弈(思维) (2018 Multi-University Training Contest 3 1006)

    6324.Problem F. Grab The Tree 题目看着好难,但是题解说的很简单,写出来也很简单.能想出来就是简单的,想不出来就难(讲道理,就算是1+1的题目,看不出来就是难的啊). 和后 ...

  8. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  9. LeetCode Weekly Contest 28

    1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...

随机推荐

  1. Atitit mac os 版本 新特性 attilax大总结

    Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0)  1984年2 2.2. Mac OS 7. ...

  2. Extjs5 tabs实例

    <%@ page language= "java" contentType ="text/html; charset=UTF-8"     pageEnc ...

  3. Hibernate 系列 08 - 对象识别机制

    目录导读: Hibernate 系列 学习笔记 目录 本篇目录: 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(“==”号识别) 2. equals()和hashCode()识别 1. 以 ...

  4. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  5. mongodb之使用explain和hint性能分析和优化

    当你第一眼看到explain和hint的时候,第一个反应就是mysql中所谓的这两个关键词,确实可以看出,这个就是在mysql中借鉴过来的,既然是借鉴 过来的,我想大家都知道这两个关键字的用处,话不多 ...

  6. 错误 1 类型“System.Web.Mvc.ModelClientValidationRule”同时存在于“c:\Progra

    问题如图: 解决办法: step1: 首先关闭你应用程序方案,在你保存项目的文件夹下找到ProjectName.csproj  ProjectName是你实际的应用程序名称. step2: 用文字编辑 ...

  7. 运维之网络安全抓包—— WireShark 和 tcpdump

    ------------------------------------------------本文章只解释抓包工具的捕获器和过滤器的说明,以及简单使用,应付日常而已----------------- ...

  8. python-函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  9. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)

    在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...

  10. 解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。

    说明:本文所有算法的涉及到的优化均指在PC上进行的,对于其他构架是否合适未知,请自行试验. Box Filter,最经典的一种领域操作,在无数的场合中都有着广泛的应用,作为一个很基础的函数,其性能的好 ...