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\}, \ (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\), 可以维护一个点的队列使得
- 相邻两点的斜率严格递减.
- 任意相邻两点的斜率都满足 \(\eqref{general_C}\) 式
这样队尾的点即为最优.
由 \(n\) 个点构造这样的一个队列的复杂度是 \(O(n)\). 另外, 可以令队列中的点只满足上述条件1, 然后从后向前遍历或者二分寻找 与前一个点斜率仍满足 \(\eqref{general_C}\) 式的最末的那个点.
然而我们并不能对每个 \(OPT_i\) 都从头求一遍, 那样复杂度和暴力一样. 对于一般情况, 我们可以动态维护一个斜率严格递减的队列, 在上面二分求解, 复杂度是 \(O(n\log n)\) . 当 \(f(i)\) 单调时, 复杂度可以做到 \(O(n)\) :
- \(f(i)\) 递增: 在斜率单调递减的基础上, 每次在求解 \(OPT_i\) 之前, 若队尾两点满足 \(g(j_1, j_2) \le f(i)\) , 则队尾点出队, 反复该操作. 用队尾元素计算DP值.
- \(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)\) :
- 形如 \(g(i,j)>f(i)\) , 维护一个相邻点斜率严格递减的点列.
- 形如 \(g(i,j)<f(i)\) , 维护一个相邻点斜率严格递增的点列.
DUT Star Weekly Contest #3 Problem F Solution的更多相关文章
- 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 ...
- 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 ...
- 2019 GDUT Rating Contest II : Problem F. Teleportation
题面: Problem F. Teleportation Input file: standard input Output file: standard output Time limit: 15 se ...
- Problem F Plug It In!
题目链接:https://cn.vjudge.net/contest/245468#problem/F 大意:给你插座和电器的对应关系,有多个电器对应一个插座的情况,但是一个插座只能供一个电器使用,现 ...
- 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 ...
- 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 ...
- HDU 6324.Problem F. Grab The Tree-博弈(思维) (2018 Multi-University Training Contest 3 1006)
6324.Problem F. Grab The Tree 题目看着好难,但是题解说的很简单,写出来也很简单.能想出来就是简单的,想不出来就难(讲道理,就算是1+1的题目,看不出来就是难的啊). 和后 ...
- Leetcode Weekly Contest 86
Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...
- LeetCode Weekly Contest 28
1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...
随机推荐
- 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. ...
- Extjs5 tabs实例
<%@ page language= "java" contentType ="text/html; charset=UTF-8" pageEnc ...
- Hibernate 系列 08 - 对象识别机制
目录导读: Hibernate 系列 学习笔记 目录 本篇目录: 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(“==”号识别) 2. equals()和hashCode()识别 1. 以 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- mongodb之使用explain和hint性能分析和优化
当你第一眼看到explain和hint的时候,第一个反应就是mysql中所谓的这两个关键词,确实可以看出,这个就是在mysql中借鉴过来的,既然是借鉴 过来的,我想大家都知道这两个关键字的用处,话不多 ...
- 错误 1 类型“System.Web.Mvc.ModelClientValidationRule”同时存在于“c:\Progra
问题如图: 解决办法: step1: 首先关闭你应用程序方案,在你保存项目的文件夹下找到ProjectName.csproj ProjectName是你实际的应用程序名称. step2: 用文字编辑 ...
- 运维之网络安全抓包—— WireShark 和 tcpdump
------------------------------------------------本文章只解释抓包工具的捕获器和过滤器的说明,以及简单使用,应付日常而已----------------- ...
- python-函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...
- C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...
- 解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。
说明:本文所有算法的涉及到的优化均指在PC上进行的,对于其他构架是否合适未知,请自行试验. Box Filter,最经典的一种领域操作,在无数的场合中都有着广泛的应用,作为一个很基础的函数,其性能的好 ...