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 ...
随机推荐
- JS函数声明的问题
三个例子 var a = 10; 2 function test(){ 3 a = 100; 4 console.log(a); 5 console.log(this.a); 6 var a; 7 c ...
- Scala override
var 变量不能在子类中重写,除非父类是抽象类 在抽象类中var变量不能赋初值 abstract class Person{ val name="" def name1=" ...
- Android Weekly Notes Issue #233
Android Weekly Issue #233 November 27th, 2016 Android Weekly Issue #233 本期内容包括: 用Mockito做RxJava的单元测试 ...
- 9.PNG的制作
1.背景自适应且不失真问题的存在 制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会. 比如: 1.列表的背景图一定,但是列表的高度随着列表 ...
- 分享iOS开发常用(三方类库,工具,高仿APP,实用网站,技术干货)
一 . JSONModel (三方类库会有更新,建议大家在线下载) http://pan.baidu.com/s/1i5ybP1z 二.AFNetworkiong http://pan.baidu. ...
- php foreach引用赋值
在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...
- UDAD 用户故事驱动的敏捷开发 – 演讲实录
敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...
- Spring profile配置应用
spring配置文件中可以配置多套不同环境配置,如下: <beans xml.....> <beans profile="dev"> < ...
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- List集合的removeAll(Collection<E> col) 和clear方法的区别
//removeAll()方法private static void testList(){ List<String> list = new ArrayList<String> ...