第一道此类的题,所以这是一篇假的博客,定理不会证明不理性

也不一定对

我是从这篇博客看的 = =

很显然是让你求 p[i] = max{a[j] + sqrt(i - j)} - a[i]

就是 max{a[j] + sqrt(|i - j|)}

这是一个 1D/1D 动态规划

考虑对于绝对值的情况不好做,那就强行去掉绝对值
之后正反各做一遍

设 sqrt(i - j) 为 w[j, i]

它显然满足区间包含单调性,考虑证明它满足四边形不等式

设 j < j + 1 < i < i + 1

应该是 w[j, i] + w[j + 1, i + 1] 与 w[j + 1, i] + w[j, i + 1] 的关系

由于函数 y = sqrt(x) 的图像是斜率递减的

所以显然有 w[j, i] + w[j + 1, i + 1] > w[j + 1, i] + w[j, i + 1] ①

考虑决策单调性,设对 i 有 a[j + 1] + w[j + 1, i] > a[j] + w[j, i] ②

① + ② 得 a[j + 1] + w[j + 1, i + 1] > a[j] + w[j, i + 1]

所以若对 i 成立对 i + 1 也成立

所以决策点是单调的

那么整个序列每个位置对应的最优决策点组成的序列应该是这样:

111133336666....

可以用队列来维护它,队列中存三元组 (l, r, id) 
表示 id 这个决策点能更新的区间为 [l, r]

实际操作起来是这样的:

考虑当前点 i 的影响,若它能比之前的一些点优,
它一定是将整个序列从某一个位置开始到 n 的最优决策点

那么它能比之前点优的条件就是对于 n ,当前点比队尾优

然后会有一些决策点被当前点废掉,
条件就是对于一个决策点 p , 若在它能更新的区间左端点 l 处, i 比 p 优,
则这个点没有用了

那么若队列未被弹空,最后剩下的队尾一定是满足在它的 l 处 它比 i 优

r 就不一定了,这里在队尾的 [l, r] 中二分第一个 i 比 id 优的位置,设为 dst

那么队尾的 r 就要改成 dst - 1

并将 i 入队,区间为 [dst, n]


代码:

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<cmath>
using namespace std;const int MAXN = 500005;struct INFO{int l, r, id;INFO(int L = 0, int R = 0, int ID = 0) {l = L; r = R; id = ID;}
}q[MAXN];
int n, hd, tl;
int a[MAXN], b[MAXN];
double f1[MAXN], f2[MAXN];inline int rd() {register int x = 0;register char c = getchar();while(!isdigit(c)) c = getchar();while(isdigit(c)) {x = x * 10 + (c ^ 48);c = getchar();}return x;
}
inline int hfs(int l, int r, int bck, int cur, int *arr) {register int mid = 0, ans = l;while(l <= r) {mid = ((l + r) >> 1);if((double)arr[bck] + sqrt(mid - bck) < (double)arr[cur] + sqrt(mid - cur)) {ans = mid;r = mid - 1;} else l = mid + 1;}return l;
}
inline void work(int *val, double *f) {hd = 1; tl = 0;q[++tl] = INFO(1, n, 1);for(int i = 2; i <= n; ++i) {++q[hd].l;//printf("i = %d, hd = %d, tl = %d\n", i, hd, tl);while(hd <= tl && q[hd].r < q[hd].l) ++hd;if((tl < hd) || ((double)val[i] + sqrt(n - i) > (double)val[q[tl].id] + sqrt(n - q[tl].id))) {while(hd <= tl && ((double)val[i] + sqrt(q[tl].l - i) > (double)val[q[tl].id] + sqrt(q[tl].l - q[tl].id))) --tl;if(tl < hd) {q[++tl] = INFO(i, n, i);} else {register int dst = hfs(q[tl].l, q[tl].r, q[tl].id, i, val);q[tl].r = dst - 1;q[++tl] = INFO(dst, n, i);}}f[i] = (double)val[q[hd].id] + sqrt(i - q[hd].id) - val[i];}return;
}int main() {n = rd();for(int i = 1; i <= n; ++i) a[i] = b[n - i + 1] = rd();work(a, f1);work(b, f2);for(int i = 1; i <= n; ++i) printf("%d\n", max(0, (int)ceil(max(f1[i], f2[n - i + 1]))));return 0;
}

转载于:https://www.cnblogs.com/xcysblog/p/9770718.html

BZOJ2216: [Poi2011]Lightning Conductor相关推荐

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

    题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...

  2. [BZOJ2216][Poi2011]Lightning Conductor[决策单调性优化]

    最初在HDU的ACM模板上看到这个分治的DP优化 用这个的前提是不强制在线(f[i]不由前面的f转移过来)且决策单调 \[ \forall j\in \left[ \text{1,}n \right] ...

  3. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)

    2216: [Poi2011]Lightning Conductor Time Limit: 25 Sec  Memory Limit: 64 MB Submit: 1292  Solved: 443 ...

  4. BZOJ 2216 Poi2011 Lightning Conductor 动态规划

    题目大意:给定一个序列aia_i,对于每一个ii求⌈max{aj+|i−j|−−−−−√}−ai⌉\lceil max\{ a_j+\sqrt{|i-j|}\}-a_i\rceil 看了题解才知道是决 ...

  5. luogu p3515 Lightning Conductor

    luogu p3515 Lightning Conductor 给定一个长度为n的序列,对于每一个i∈[1,n]i∈[1,n]i∈[1,n],求出一个最小的非负整数p,使得对于所有的j∈[1,n]j∈ ...

  6. P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】

    正题 题目链接:https://www.luogu.com.cn/problem/P3507 题目大意 nnn个数字的一个序列aaa,对于每个位置iii求一个pip_ipi​使得对于任意jjj满足 p ...

  7. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  8. bzoj4850 [JSOI2016]灯塔

    bzoj4850 [JSOI2016]灯塔 给定一个序列 \(a_i\) ,对于每个 \(i\) ,求出一个 \(p\) 使得对于任意 \(j\) ,都有 \(a_j\leq a_i+p-\sqrt ...

  9. 基础省选+NOI-第4部分 动态规划

    1.期望概率DP [整理]简单的数学期望和概率DP [整理]简单的数学期望和概率DP - nimphy - 博客园 期望&概率dp总结 期望&概率dp总结_十分残念的博客-CSDN博客 ...

最新文章

  1. 不愧是大佬用Python做一个游戏辅助脚本,完整编程思路分享!
  2. 高通平台点亮LCD个人总结
  3. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框
  4. android 决TextView中MaxLines与ellipsize=end冲突问题
  5. Multidex实现简要分析
  6. [leetcode]27.移除元素
  7. 321. Create Maximum Number 解题方法详解
  8. 四川大学计算机应用基础第二次,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
  9. 增删改查通用测试用例-禅道模板
  10. python词云图_Python生成一篇文章的词云图
  11. win11菜单怎么添加快捷方式 Windows11开始菜单添加快捷方式的设置方法
  12. 数据发现:凭什么登顶富豪榜?
  13. javaee--学生成绩录入与显示--Struts2标签的使用
  14. PAIP.利用SyncML协议来同步备份手机短信联系人.txt
  15. WPF中使用StackPanel,Border进行简单布局
  16. c语言二进制微粒群算法,离散二进制微粒群算法.pdf
  17. 小米高通9008授权MiFlash刷机免认证思路
  18. java 象棋人机开源码,中国象棋人机博弈程序(扁平化棋局) C语言实现
  19. Excel表格中两列数据对比,找出异同的数据
  20. 云栖大会 | Greenplum 6.0内核优化解读和7.0展望

热门文章

  1. 【ubuntu-qt-dlib】 配置问题 (一) undefined reference to `XPending'
  2. 卷积神经网络经典模型要点
  3. 护理方面关于人工智能的构想_如何提出惊人的AI,ML或数据科学项目构想。
  4. 机器学习模型的性能指标
  5. C语言高级编程:const限定函数形参
  6. 人可以拒绝任何东西,但绝对不可以拒绝成熟
  7. “所有一切”和“介于之间”:欧美“新媒体”艺术
  8. 服务器系统怎么调节风扇速度,服务器主板怎样设置风扇速度
  9. asp python 定时任务_Python定时任务轻量解决方案——Schedule
  10. ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...