bzoj 2216: Lightning Conductor 单调队列优化dp
题目大意
已知一个长度为\(n\)的序列\(a_1,a_2,...,a_n\)对于每个\(1\leq i\leq n\),找到最小的非负整数\(p\)满足:
对于任意的\(j\), \(a_j \leq a_i + p - \sqrt{\vert{i-j}\vert{}}\)
题解
我们化简不等式+分类讨论可以得到:
\]
\]
我们可以正反都dp一遍,这样就剩下了一个式子:
\(f_i = max{\sqrt{i-j} + a_j} - a_i\)
我们发现,max中的式子是具有单调性的,什么单调性呢...
我们知道对于每个位置\(i\)都会选取一个最优决策点\(j\),
我们称\(j\)对\(i\)做出了贡献,那么我们知道:
对于任意的一个点\(i\)一定会对一段区间连续地做出贡献.
并且下标和区间所对应的位置都是单调的.
我们可以采用一种二分式的单调队列来处理这个问题
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 500010;
double f[maxn],g[maxn];
int a[maxn];
inline double calc(int j,int i){
return a[j] + sqrt(double(i-j));
}
struct Node{
int p,l,r;
Node(){}
Node(int a,int b,int c){p=a;l=b;r=c;}
}q[maxn];
int l,r,n;
inline void dp(double *f){
l = 0;r = -1;
f[1] = .0;
q[++r] = Node(1,2,n);
for(int i=2;i<=n;++i){
++q[l].l;
while(i > q[l].r) ++l;
f[i] = calc(q[l].p,i) - a[i];
if(calc(q[r].p,n) > calc(i,n)) continue;
while(l <= r && calc(q[r].p,q[r].l) < calc(i,q[r].l)) --r;
if(l <= r){
int ls = q[r].l,rs = q[r].r;
int x = -1;
while(ls <= rs){
int mid = (ls+rs) >> 1;
if(calc(i,mid) >= calc(q[r].p,mid)) x = mid,rs = mid-1;
else ls = mid+1;
}
q[r].r = x - 1;
q[++r] = Node(i,x,n);
}else q[++r] = Node(i,i+1,n);
}
}
int main(){
read(n);
for(int i=1;i<=n;++i) read(a[i]);
dp(f);reverse(a+1,a+n+1);
dp(g);reverse(g+1,g+n+1);
for(int i=1;i<=n;++i){
printf("%d\n",(int)ceil(max(0.0,max(f[i],g[i]))));
}
getchar();getchar();
return 0;
}
bzoj 2216: Lightning Conductor 单调队列优化dp的更多相关文章
- BZOJ 1233 干草堆 (单调队列优化DP)
$ BZOJ~1233~~ $ 干草堆: (题目特殊性质) $ solution: $ 很妙的一道题目,开始看了一眼觉得是个傻逼贪心,从后往前当前层能多短就多短,尽量节省花费.但是这是DP专题,怎么会 ...
- BZOJ 1855 股票交易(单调队列优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票 ...
- BZOJ 2806: [Ctsc2012]Cheat(单调队列优化dp+后缀自动机)
传送门 解题思路 肯定先要建出来广义后缀自动机.刚开始以为是个二分+贪心,写了一下结果\(20\)分.说一下正解,首先显然\(L_0\)具有单调性,是可以二分的.考虑二分后怎样判合法,对于分割序列很容 ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...
- 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
- P4381 [IOI2008]Island(基环树+单调队列优化dp)
P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...
- 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易
DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
随机推荐
- Java 调用OPENOFFIC 转换文档类型
public static void office2PDF(String sourceFile, String destFile) { try { File inputFile = new File( ...
- win10系统架构调用
操作系统模型 操作系统有两种模式: 用户模式 内核模式 当用户模式调用系统服务时,CPU执行一个特殊的指令以切换到内核模式(Ring0),当系统服务调用完成时,操作系统切换回用户模式(Ring3). ...
- dede二级导航与二级栏目 ----内容介绍二级导航
{dede:channelartlist typeid='top'}//如果只需要拿一列,则需要使用row='1'这个属性否则会根据子频道的数目循环输出 <a href="{dede: ...
- Bootstrap学习速查表(二) 排版及表格
一.h1~h6标签 固定不同级别标题字体大小,h1=36px,h2=30px,h3=24px,h4=18px,h5=14px和h6=12px. 1.重新设置了margin-top和margin-bot ...
- 3.11 T-SQL语句
T-SQL语句 1.创建表create table Car --创建一个名字是Car的表-- ( Code varchar(50) primary key, --第一列名字是Code 数据类型 ...
- <转> Struct 和 Union区别 以及 对内存对齐方式的说明
转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...
- 九度OJ 1053:互换最大最小数 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6613 解决:2676 题目描述: 输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出. 输入: 测试数据有多组 ...
- iframe式ajax调用
1.新建 a.html <!doctype html> <html> <head> <meta charset='utf-8'> <title&g ...
- php标准库DirectoryIterator类的操作说明
<?php $dir = new DirectoryIterator(dirname(__FILE__)); foreach ($dir as $fileInfo) { if ($fileInf ...
- 我的Java开发学习之旅------>Java经典排序算法之归并排序
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...