BZOJ2216: [Poi2011]Lightning Conductor(DP 决策单调性)
题意
题目链接
Sol
很nice的决策单调性题目
首先把给出的式子移项,我们要求的$P_i = max(a_j + \sqrt{|i - j|}) - a_i$。
按套路把绝对值拆掉,$p_i = max(max_{j = 1}^i (a_j = \sqrt{i - j}), max_{j = i + 1}^n (a_j + \sqrt{j - i})) - a_i$
对于后面的一段,我们把序列翻转之后和前一段是等价的。
也就是说,我们现在只需要找到$P_i = max_{j = 1}^i (a_j + \sqrt{i - j})$
考虑到式子中只有一个max函数,那这玩意儿应该是有决策单调性的
直接设$f_j = a_j + \sqrt{i - j}, i \geqslant j$,其中$i$是自变量
观察这个函数,应该是一个在$[j, INF]$内有定义,过点$(j, a[j])$的函数,且增速与函数$g_i = \sqrt{i}$相同
我们需要做的,就是对每个$i$,找到最大的$f_j$
考虑到$g_i$增长速度会越来越慢,所以一个函数增长到一定程度后可能会被另一个函数取代
直接用单调队列维护,设$K_{i, j}$表示$f_i, f_j$的交点,$h, t$分别表示队首/尾,
当新加入一个元素$i$的时候,显然,若$K_{t -1, t} > K_{t - 1, i}$,那么$t$这个函数是没用的、
当$K_{h, h+1} < i$的时候,弹出队首
就是最后输出答案的时候有点“卡精度”,真恶心
经验:
以后看到$f_i = max(f_j) + g$的式子一定要往单调性上想,如果单调性不是很显然的话可以用换元法设函数找单调性
另外绝对值拆开算一般会好算一些
#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
using namespace std;
const int MAXN = 1e6 + , INF = 1e9 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, a[MAXN], q[MAXN], Cro[MAXN];
double P[MAXN], sqr[MAXN];
double calc(int j, int i) {
return a[j] + sqr[i - j];
}
int K(int x, int y) {
int l = max(x, y), r = N, ans = N + ;
while(l <= r) {
int mid = l + r >> ;
if(calc(x, mid) >= calc(y, mid)) l = mid + ;
else r = mid - , ans = mid;
}
return ans;
}
void solve() {
int h = , t = ;
for(int i = ; i <= N; i++) {
while(h < t && K(q[t - ], q[t]) >= K(q[t], i)) t--;
q[++t] = i;
while(h < t && K(q[h], q[h + ]) <= i) h++;
P[i] = max(P[i], calc(q[h], i));
}
}
main() {
N = read();
for(int i = ; i <= N; i++) a[i] = read(), sqr[i] = sqrt(i);
solve();
reverse(a + , a + N + );
reverse(P + , P + N + );
solve();
for(int i = N; i >= ; i--)
printf("%d\n", max(, (int)ceil(P[i]) - a[i]));
return ;
}
BZOJ2216: [Poi2011]Lightning Conductor(DP 决策单调性)的更多相关文章
- BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】
题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...
- BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】
Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
- 洛谷P3515 [POI2011]Lightning Conductor(决策单调性)
题意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) ...
- 【洛谷3515】[POI2011] Lightning Conductor(决策单调性)
点此看题面 大致题意: 给你一个序列,对于每个\(i\)求最小的自然数\(p\)使得对于任意\(j\)满足\(a_j\le a_i+p-\sqrt{|i-j|}\). 证明单调性 考虑到\(\sqrt ...
- bzoj 2216: [Poi2011]Lightning Conductor【决策单调性dp+分治】
参考:https://blog.csdn.net/clove_unique/article/details/57405845 死活不过样例看了题解才发现要用double.... \[ a_j \leq ...
- bzoj2216: [Poi2011]Lightning Conductor(分治决策单调性优化)
每个pi要求 这个只需要正反DP(?)一次就行了,可以发现这个是有决策单调性的,用分治优化 #include<iostream> #include<cstring> #incl ...
- [POI2011]Lightening Conductor(决策单调性)
好久没写过决策单调性了. 这题其实就是 $p_i=\lceil\max\limits_{j}(a_j-a_i+\sqrt{|i-j|})\rceil$. 拆成两边,先只考虑 $j<i$,然后反过 ...
- BZOJ2216 : [Poi2011]Lightning Conductor
$f[i]=\max(a[j]+\lceil\sqrt{|i-j|}\rceil)$, 拆开绝对值,考虑j<i,则决策具有单调性,j>i同理, 所以可以用分治$O(n\log n)$解决. ...
随机推荐
- Linux服务器监控工具--Nmon介绍
一.Nmon介绍(详细请参考百度百科) 是一款分析 AIX 和 Linux 性能的免费工具,这个高效的工具可以工作于任何哑屏幕.telnet 会话.甚至拨号线路.另外,它并不会消耗大量的 CPU 周期 ...
- AngularJs(Part 8)--Filters
Filters AngularJS provides fileters to transfrom data from one kind to another . For example: {{ ...
- 面试题: mysql 数据库去重 已看1 不好使
mysql去重面试总结 前言:题目大概是这样的. 建表: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE `test2` ( `id` ...
- Ubuntu12.04安装R ,Rstudio, RHive
环境: Ubuntu12.04 R-3.1.0 0.Ubuntu安装R官网的介绍 http://mirrors.ustc.edu.cn/CRAN/ Precise Pangolin (12.04; L ...
- cocos2dx之lua绑定简析
一.总原则:c++对象的生命期不依赖lua gc管理,手动创建的对象要手动销毁 二.引擎层在设计上就是支持脚本概念的(也就是说脚本的使用是“侵入式”的),与lua打交道的代码都封在CCLuaEngin ...
- 12、多空格&多制表符文本之cut域分割终极方案
解决方法分为如下三步: (1) 使用“tr”命令将制表符转换为空格: (2) 使用“tr”命令将多个重复空格删除,保留一个空格: (3) 使用“cut”命令进 ...
- 安装json format插件
更多工具->扩展->搜索:son format插件 这样得到的json数据以一种美观的样式显示.
- js常用util
/** 日期格式化 */Date.prototype.Format = function(format) { var o = { "M+" : this.getMonth() + ...
- Android 全局错误管理
package com.wlwl.yiyuan; import java.io.File; import java.io.PrintWriter; import java.io.StringWrite ...
- 洛谷P3819 松江1843路
P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一 ...