给定一序列,求对于每一个$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 ;
}

最新文章

  1. SEL-消息机制
  2. 【转】hibernate缓存:一级缓存和二级缓存
  3. 信息加密之Base64
  4. linux下查找某个目录下包含某个字符串的文件
  5. Fiddler学习纪要
  6. 关于div居中
  7. js 引用类型比较
  8. [教程] 神器i9100刷基带与内核的方法!(兼带ROOT方法)
  9. Xamarin.Android开发实践(一)
  10. C++输出数据到txt
  11. Vim扩展YouCompleteMe插件
  12. [CSS3] 学习笔记-CSS选择器
  13. 使用jquery-qrcode在页面上生成二维码,支持中文
  14. Oracle 12c CDB PDB 安装/配置/管理
  15. 嵌入式开发之hi3519---GPIO 按键驱动
  16. ORACLE函数、连接查询、约束
  17. css 新单位 fr
  18. [Objective-C] 从NSInteger说开去
  19. Numpy存字符串
  20. ios开发之--开发中可能会用到的一些函数

热门文章

  1. vim 查找与替换
  2. (LeetCode)两个链表的第一个公共节点
  3. java和erlang之间的DES加解密
  4. beego的MVC架构介绍
  5. Docker入门系列2 安装
  6. C# 串口发送 陷阱,必须知道的坑
  7. Java 学习 day05
  8. c#数组的count()和length的区别
  9. restlet验证
  10. 流畅python学习笔记:第十七章:并发处理二