给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$\forall j \neq i $有$ p_i>=a_j-a_i+ \sqrt{|i-j|}$。


绝对值很烦 ,先分左右情况单独做。现在假设j都在i左边,则$ p_{i} = max \{ a_{j}-a_{i}+ \sqrt{i-j} \} = max \{ a_{j}+ \sqrt{i-j} \} - a_i$。带根号,不易斜率优化,考虑证决策单调性。

假设最优决策为j,j之前的任意决策称之为$j'$,只与$j$有关的项令之为$h[j]=a[j]$,则有

$h[j]+\sqrt{i-j} \geqslant h[j']+\sqrt{i-j'}$  ①

现要证$ h[j]+\sqrt{i-j+1} \geqslant h[j']+\sqrt{i-j'+1}$ ②

即证$ \sqrt{i-j+1}-\sqrt{i-j} \geqslant \sqrt{i-j'+1}-\sqrt{i-j'}$($②-①$得)

那么把它看成关于$j$的函数看单调性,设$g(j)=\sqrt{i-j+1}+\sqrt{i-j}$

对其求导。

$g'(j)=[(i-j+1)^{\frac{1}{2}}]' - [(i-j)^{\frac{1}{2}}]'=-\frac{1}{2} (i-j+1)^{-\frac{1}{2}} + \frac{1}{2} (i-j)^{-\frac{1}{2}}=\frac{1}{2} (\frac{1}{\sqrt{i-j}}-\frac{1}{\sqrt{i-j+1}})$

由$ i-j<i-j+1$知$\frac{1}{2} (\frac{1}{\sqrt{i-j}}-\frac{1}{\sqrt{i-j+1}}) > 0$则函数$g(j)$单调增,则上不等式成立,满足单调性。

证完决策单调性优化即可。


错误记录:第二次写的时候line37写成l<r了,,丢人。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
struct kochiya_sanae{
int l,r,pos;
kochiya_sanae(int l0=,int r0=,int pos0=):l(l0),r(r0),pos(pos0){}
}q[N];
db sq[N],f[N],h[N];
int n,l,r;
inline void preprocess(){for(register int i=;i<=n;++i)sq[i]=sqrt((db)i);}
inline db calc(int j,int i){return (db)h[j]+sq[i-j];}
inline int find_pos(int L,int R,int j,int i){
++R;int mid;
while(L<R){
mid=L+R>>;
if(calc(j,mid)<=calc(i,mid))R=mid;
else L=mid+;
}
return R;
}
inline void dp(){
q[l=r=]=kochiya_sanae(,n,);
for(register int i=;i<=n;++i){
if(q[l].r<i)++l;else ++q[l].l;
MAX(f[i],calc(q[l].pos,i)-h[i]);
while(l<=r&&calc(q[r].pos,q[r].l)<=calc(i,q[r].l))--r;
if(r<l)q[r=l]=kochiya_sanae(i,n,i);
else{
int k;
if(calc(q[r].pos,q[r].r)>calc(i,q[r].r))k=q[r].r+;
else k=find_pos(q[r].l,q[r].r,q[r].pos,i);
if(k<=n)q[r].r=k-,q[++r]=kochiya_sanae(k,n,i);
}
}
} int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
read(n);for(register int i=;i<=n;++i)read(h[i]);h[]=-;
preprocess();dp();reverse(h+,h+n+);reverse(f+,f+n+);dp();
for(register int i=n;i;--i)printf("%d\n",(int)ceil(f[i]));
return ;
}

P3515 [POI2011]Lightning Conductor[决策单调性优化]的更多相关文章

  1. 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性

    [BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...

  2. LOJ2074/2157 JSOI2016/POI2011 Lightning Conductor 决策单调性DP

    传送门 我们相当于要求出\(f_i = \max\limits_{j=1}^{n} (a_j + \sqrt{|i-j|})\).这个绝对值太烦人了,考虑对于\(i>j\)和\(i<j\) ...

  3. P3515 [POI2011]Lightning Conductor(决策单调性分治)

    P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...

  4. BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性

    BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性 Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n, ...

  5. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  6. 洛谷P3515 [POI2011]Lightning Conductor(决策单调性)

    题意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) ...

  7. 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP

    题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...

  8. P3515 [POI2011]Lightning Conductor

    首先进行一步转化 $a_j \leq a_i + q - sqrt(abs(i - j))$ $a_i + q \geq a_j + sqrt(abs(i-j))$ 即 $q = max (a_j + ...

  9. 【bzoj2216】[Poi2011]Lightning Conductor 1D1D动态规划优化

    Description 已知一个长度为n的序列a1,a2,…,an.对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p – sqrt(abs ...

随机推荐

  1. 转:PCIe基础知识

    PCIe基础知识   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zqixiao_09/article/details/51842542 PCIe ...

  2. 用Squid和DNSPod打造自己的CDN详细教程

    本篇教程是顺应大家的要求而写.教程内大部分都是奶罩在为VeryCD等大型网站构建CDN时所累积的经验.在一些概念方面可能会有一些错漏,希望 大家指正. 本教程面对的对象是个人站长,所以各方面会力求傻瓜 ...

  3. Hibernate学习一----------Hibernate初实现

    © 版权声明:本文为博主原创文章,转载请注明出处 ORM(Object/Relationship Mapping):对象/关系映射 - 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系 ...

  4. cmake学习之-configure_file

    一.系统版本 cmake version: 3.5.2 系统版本: Ubuntun 16.04 cmake docment: 3.14.4 最后更新: 2019-05-30 二.指令说明 config ...

  5. 10 redis--频道发布与消息订阅

    消息订阅 使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 客户端例子: redis 127.0.0.1:6379> subscribe news ...

  6. 【Android】带底部指示的自定义ViewPager控件

    在项目中经常需要使用轮转广告的效果,在android-v4版本中提供的ViewPager是一个很好的工具,而一般我们使用Viewpager的时候,都会选择在底部有一排指示物指示当前显示的是哪一个pag ...

  7. Using ADO.NET Data Service

    ADO.NET Data Service是随同Visual Studio 2008 SP1提供的用于构建在数据对象模型 (如EF-DEMX, LINQ-DBML) 之时来快速提供企业网内外的轻量级数据 ...

  8. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  9. RPM包的使用

    不同yum安装源配置文件 ls -l /etc/yum.repo.d RPM包的主包和子功能包 mount /dev/cdrom /media/cdrom cd /media/cdrom/Packag ...

  10. error LNK2022: metadata operation failed (801311D6) : Differing number of methods in duplicated types

    本文主要是记录一个C++编译错误的解决方案,具体错误请看本文标题. 这个错误主要是由Managed C++的增量编译导致的,这是VS 2008的一个bug,在VS 2010已经修复,我使用的正式201 ...