题目大意

已知一个长度为\(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{}}\)

题解

我们化简不等式+分类讨论可以得到:

\[f_i = max{\sqrt{i-j} + a_j} - a_i, \text{$j < i$}
\]

\[f_i = max{\sqrt{j-i} + a_j} - a_i, \text{$j > i$}
\]

我们可以正反都dp一遍,这样就剩下了一个式子:

\(f_i = max{\sqrt{i-j} + a_j} - a_i\)

我们发现,max中的式子是具有单调性的,什么单调性呢...

我们知道对于每个位置\(i\)都会选取一个最优决策点\(j\),

我们称\(j\)对\(i\)做出了贡献,那么我们知道:

对于任意的一个点\(i\)一定会对一段区间连续地做出贡献.

并且下标和区间所对应的位置都是单调的.

我们可以采用一种二分式的单调队列来处理这个问题

Code

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. inline void read(int &x){
  8. x=0;char ch;bool flag = false;
  9. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  10. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  11. }
  12. inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
  13. inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
  14. const int maxn = 500010;
  15. double f[maxn],g[maxn];
  16. int a[maxn];
  17. inline double calc(int j,int i){
  18. return a[j] + sqrt(double(i-j));
  19. }
  20. struct Node{
  21. int p,l,r;
  22. Node(){}
  23. Node(int a,int b,int c){p=a;l=b;r=c;}
  24. }q[maxn];
  25. int l,r,n;
  26. inline void dp(double *f){
  27. l = 0;r = -1;
  28. f[1] = .0;
  29. q[++r] = Node(1,2,n);
  30. for(int i=2;i<=n;++i){
  31. ++q[l].l;
  32. while(i > q[l].r) ++l;
  33. f[i] = calc(q[l].p,i) - a[i];
  34. if(calc(q[r].p,n) > calc(i,n)) continue;
  35. while(l <= r && calc(q[r].p,q[r].l) < calc(i,q[r].l)) --r;
  36. if(l <= r){
  37. int ls = q[r].l,rs = q[r].r;
  38. int x = -1;
  39. while(ls <= rs){
  40. int mid = (ls+rs) >> 1;
  41. if(calc(i,mid) >= calc(q[r].p,mid)) x = mid,rs = mid-1;
  42. else ls = mid+1;
  43. }
  44. q[r].r = x - 1;
  45. q[++r] = Node(i,x,n);
  46. }else q[++r] = Node(i,i+1,n);
  47. }
  48. }
  49. int main(){
  50. read(n);
  51. for(int i=1;i<=n;++i) read(a[i]);
  52. dp(f);reverse(a+1,a+n+1);
  53. dp(g);reverse(g+1,g+n+1);
  54. for(int i=1;i<=n;++i){
  55. printf("%d\n",(int)ceil(max(0.0,max(f[i],g[i]))));
  56. }
  57. getchar();getchar();
  58. return 0;
  59. }

bzoj 2216: Lightning Conductor 单调队列优化dp的更多相关文章

  1. BZOJ 1233 干草堆 (单调队列优化DP)

    $ BZOJ~1233~~ $ 干草堆: (题目特殊性质) $ solution: $ 很妙的一道题目,开始看了一眼觉得是个傻逼贪心,从后往前当前层能多短就多短,尽量节省花费.但是这是DP专题,怎么会 ...

  2. BZOJ 1855 股票交易(单调队列优化DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票 ...

  3. BZOJ 2806: [Ctsc2012]Cheat(单调队列优化dp+后缀自动机)

    传送门 解题思路 肯定先要建出来广义后缀自动机.刚开始以为是个二分+贪心,写了一下结果\(20\)分.说一下正解,首先显然\(L_0\)具有单调性,是可以二分的.考虑二分后怎样判合法,对于分割序列很容 ...

  4. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  5. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  6. 单调队列优化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 ...

  7. P4381 [IOI2008]Island(基环树+单调队列优化dp)

    P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...

  8. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...

  9. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

随机推荐

  1. iOS 从UITableViewController中分离数据源

    之前看objc.io #1 Light View Controllers看到一个非常不错的技巧:从UITableViewController中分离数据源,这样能够减小UITableViewContro ...

  2. jdbc 链接池

    package cn.itcast.jdbc.datasourse; import java.sql.Connection;import java.sql.DriverManager;import j ...

  3. G1垃圾收集或者Java中垃圾收集的名词收集

    HotSpot WTF,热壶?我他奶奶的还热火呢,Heat,you know? 总之HotSpot是一种遵循java虚拟机规范的一种实现啦,当时并不是Sun公司搞出来的,而是另外一家公司,后来被Sun ...

  4. Git分支中的远程操作实践

    Git分支中的远程操作实践 前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了<Git中的merge.rebase.cherry-pick以及交互式rebase>,本篇 ...

  5. erlang的RSA签名与验签

    1.RSA介绍 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对 其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而 ...

  6. Android自定义滑动显示隐藏布局

    方式一:上下左右滑动显示隐藏布局 总结代码地址: http://git.oschina.net/anan9303/customView参考例子: http://www.jianshu.com/p/fc ...

  7. 【BZOJ4052】[Cerc2013]Magical GCD 乱搞

    [BZOJ4052][Cerc2013]Magical GCD Description 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12.  求一个连续子序列,使得在所有的连续 ...

  8. 文件查找工具Everything小工具的使用

    Everything 小工具的使用: 首先它是一款基于名称实时定位文件和目录的搜索工具,有以下几个优点: 快速文件索引 快速文件搜索 较低资源占用 轻松分享文件索引 实时跟踪文件更新 通过使用ever ...

  9. jQuery学习笔记(8)--表格筛选

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  10. Locality-sensitive hashing Pr[m(Si) = m(Sj )] = E[JSˆ (Si, Sj )] = JS(Si, Sj )

    A hash function that maps names to integers from 0 to 15. There is a collision between keys "Jo ...