【BZOJ2216】Lightning Conductor(动态规划)
【BZOJ2216】Lightning Conductor(动态规划)
题面
题解
\(\sqrt {|i-j|}\)似乎没什么意义,只需要从前往后做一次再从后往前做一次就好了。
只考虑从前往后,把给定的式子移项,可以得到
\(p\ge a[j]-a[i]+\sqrt{i-j}\)
而\(a[i]\)是当前的枚举的位置\(i\)的值,这个是不会变化的。
所以要求的就是\(max(a[j]-\sqrt{i-j})\)
画出\(\sqrt x\)的函数图像,是一个增长率越来越慢的函数。
那么,如果当前转移\(i\)的时候,\(j\)优于\(k\)(\(k\lt j\)),
那么接下来转移\(i+1\)的时候同样\(j\)更优。
既然具有了决策单调性,直接二分就好了。
维护一个单调队列,存下当前位置\(j\)转移到哪些区间是更优的,
不难发现这个区间一定是\([l,n]\),当然也可能是个空区间。
插入的时候也二分修改一下就好了。有点类似于诗人小G那题。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define RG register
#define MAX 500500
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node{int i,l,r;}Q[MAX];
int h,t;
int n,a[MAX];
double f[MAX];
double Trans(int j,int i){return a[j]+sqrt(i-j);}
void Work()
{
Q[h=t=1]=(Node){1,2,n};
for(int i=2;i<=n;++i)
{
while(h<=t&&Q[h].r<i)++h;Q[h].l=i;
f[i]=max(f[i],Trans(Q[h].i,i)-a[i]);
while(h<=t&&Trans(Q[t].i,Q[t].l)<Trans(i,Q[t].l))--t;
if(h>t){Q[++t]=(Node){i,i,n};continue;}
int l=Q[t].l,r=Q[t].r,ret=Q[t].r+1;
while(l<=r)
{
int mid=(l+r)>>1;
if(Trans(Q[t].i,mid)<Trans(i,mid))ret=mid,r=mid-1;
else l=mid+1;
}
if(ret!=Q[t].l)Q[t].r=ret-1;else --t;
if(ret<=n)Q[++t]=(Node){i,ret,n};
}
}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
Work();reverse(&a[1],&a[n+1]);reverse(&f[1],&f[n+1]);
Work();reverse(&f[1],&f[n+1]);
for(int i=1;i<=n;++i)printf("%d\n",(int)(ceil(f[i])));
return 0;
}
【BZOJ2216】Lightning Conductor(动态规划)的更多相关文章
- [BZOJ2216]Lightning Conductor
原来决策单调性指的是这个东西... 一些DP可以写成$f_i=\max\limits_{j\lt i}g(i,j)$,设$p_i(p_i<j)$表示使得$g(i,j)$最大的$j$,如果$p_1 ...
- 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性
[BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...
- [bzoj 2216] [Poi2011] Lightning Conductor
[bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
- 【bzoj2216】[Poi2011]Lightning Conductor 1D1D动态规划优化
Description 已知一个长度为n的序列a1,a2,…,an.对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p – sqrt(abs ...
- BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】
题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...
- BZOJ2216 : [Poi2011]Lightning Conductor
$f[i]=\max(a[j]+\lceil\sqrt{|i-j|}\rceil)$, 拆开绝对值,考虑j<i,则决策具有单调性,j>i同理, 所以可以用分治$O(n\log n)$解决. ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- bzoj 2216 Lightning Conductor - 二分法 - 动态规划
题目传送门 需要root权限的传送门 题目大意 给定一个长度为$n$的数组,要求对每个$1 \leqslant i \leqslant n$找到最小整数的$p$,对于任意$j$满足使得$a_{i} + ...
随机推荐
- github如何删除仓库中文件夹
github项目中,经常大家更新.添加都非常熟悉,但是如果想要删掉一个文件夹,很多人就不知道怎么操作了. 网上查了一些方法,大部分都是删除仓库重新上传,这样肯定是不行的,首先不说任务量大,而且删除仓库 ...
- JavaScript学习笔记(一)——JS速览
第一章 JS速览 1 限制时间处理事件 <script> setTomeout(wakeUpUser,5000); function wakeUpUser() { alert(" ...
- LeetCode 148——排序链表
1. 题目 2. 解答 2.1 快速排序 可参考 快速排序和归并排序 中的第一种快速排序思想,与在数组中排序有两点不同. 第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在 ...
- Facebook190亿美元收购WhatsApp
Facebook收购WhatsApp,前后只花费10天时间.这是Facebook迄今规模最大的一笔收购,可能也是史上最昂贵的一笔针对靠私人风投起家的企业的收购案. 2月9日,马克•扎克伯格(Mark ...
- MySQL 中的数据类型介绍
1.MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 2.数值类型(12) 2.1. ...
- 子元素设置margin-top后,父元素跟随下移的问题
子元素设置margin-top后,父元素跟随下移的问题 <!DOCTYPE html> <html lang="en"> <head> < ...
- 学霸系统UI部分功能规格说明书
发布人员:软件工程实践小队 发布内容:学霸系统UI部分功能规格说明书 版本:学霸V1.1版本 ◆Part 1:引言 1.1目的 本功能规格说明书的目的在于明确 ...
- AOP:静态代理实现方式①通过继承②通过接口
文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...
- JS 中substring() , substr(), slice() 的区别
substr(start, length) : 截取从start索引开始的字符,长度为length的字符串 substring(start, end) : 截取从start索引开始的字符,以end索引 ...
- iptables 工具的使用
试验建议:关闭CentOS 7 或 CentOS 6的防火墙 (systemctl stop firewalld ; systemctl disable firewalld 或 service ipt ...