[bzoj 2216] [Poi2011] Lightning Conductor

Description

已知一个长度为n的序列a1,a2,…,an。

对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p – sqrt(abs(i-j))

Input

第一行n,(1<=n<=500000)

下面每行一个整数,其中第i行是ai。(0<=ai<=1000000000)

Output

n行,第i行表示对于i,得到的p

Sample Input

6
5
3
2
4
2
4

Sample Output

2
3
5
3
5
4

将不等式变一下形就可以得到这个:

\[P\ge { A }_{ j }+\sqrt { \left| i-j \right| } -{ A }_{ i }
\]

由于对任意的A都成立,那么就有:

\[P=max\{ { A }_{ j }+\sqrt { \left| i-j \right| } -{ A }_{ i }\}
\]

这个是满足决策单调性的,假设存在 $ j>k $ 且j比k更优,考虑到函数 $ f\left( x \right) =\sqrt { x } $ 为一个上凸函数,那么由于 $ i-k $ 于 $ i-j $ 的增长速度相同,而 \(i-k\) 更大,所以$ f\left( k \right) =\sqrt { i-k } $也就增长得越快(就是下跌得更猛).所以可以用决策单调性优化.(即k永世不得翻身).那么就可以二分决策的端点进行dp了.绝对值左右两遍dp一下就可以去掉了.

#include <cstdio>
#include <cmath>
#include <algorithm> using std :: max;
using std :: sqrt;
using std :: ceil; static const int maxm = 1e6 + 10; int f[maxm],g[maxm],A[maxm];
int n; void solve1(int l,int r,int L,int R){
if(l > r || L > R) return; int pos = 0,mid = (l + r) >> 1; double mx = 0; for(int i = L;i <= R && i <= mid;i++)
if((double) A[i] + sqrt(mid - i) >= mx)
pos = i,mx = (double) A[i] + sqrt(mid - i); f[mid] = A[pos] + ceil(sqrt(mid - pos)); solve1(l,mid - 1,L,pos);
solve1(mid + 1,r,pos,R);
} void solve2(int l,int r,int L,int R){
if(l > r || L > R) return; int pos = 0,mid = (l + r) >> 1; double mx = 0; for(int i = R;i >= L && i >= mid;i--)
if((double) A[i] + sqrt(i - mid) >= mx)
pos = i,mx = (double) A[i] + sqrt(i - mid); g[mid] = A[pos] + ceil(sqrt(pos - mid)); solve2(l,mid - 1,L,pos);
solve2(mid + 1,r,pos,R);
} int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)scanf("%d",&A[i]); solve1(1,n,1,n);solve2(1,n,1,n); for(int i = 1;i <= n;i++)printf("%d\n",max(f[i],g[i])-A[i]); return 0;
}

传送门(权限题,非bzoj)

最新文章

  1. (实用篇)微信支付扫码支付php版
  2. 接触到得到新语言里面涉及到很多关于ECMscript相关知识,所以还是来总结一下吧
  3. http://blog.csdn.net/chenleixing/article/details/43740759
  4. linux ubuntu删除引导 grub出现错误解决方案
  5. global 用法
  6. NHIBERNATE之映射文件配置说明(转载4)
  7. C++中#include &lt;xxx.h&gt;和#include &quot;xxx.h&quot;的区别(尖括号和双引号的区别)
  8. Android中自定义veiw使用Java中的回调方法
  9. 多项式求和,素数判定 HDU2011.2012
  10. 前端性能优化成神之路--vue组件懒加载(Vue Lazy Component )
  11. Angular4的依赖注入
  12. sql注入case
  13. ubuntu16.04node和npm卸载干净
  14. window.location方法获取URL
  15. psd页面切割成html技巧总结
  16. Shell中的IFS
  17. mybatis中的mapper接口文件以及selectByExample类的实例函数详解
  18. hibernate中的sql 1+n 问题
  19. CodeForces - 586D Phillip and Trains 搜索。vis 剪枝。
  20. 雷林鹏分享:C# 委托(Delegate)

热门文章

  1. Uncaught Error: Script error for &quot;popper.js&quot;, needed by: bootstrap - require.js
  2. yii2邮箱发送
  3. 手动完全卸载Office
  4. SPOJ1026 概率DP
  5. UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode byte 0xab in position 11126: illegal multibyte sequence
  6. TouTiao开源项目 分析笔记17 新闻媒体专栏
  7. Javascript Step by Step - 02
  8. miniui IE对省略号即text-overflow:ellipsis显示不一样的问题
  9. 用 Flask 来写个轻博客
  10. 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(下)