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

看了题解才知道是决策单调性。。。
那我这个做法可以算是乱搞了?
(似乎这个做法也可以拓展到所有满足决策单调性的1D1D上?)

显然我们可以做两遍,第一遍只考虑j<ij,第二遍只考虑j>ij>i
首先根号这东西有个性质。。。n−√\sqrt n的增长速度随nn的增大而减小。。(其实就是函数上凸)
这意味着什么呢?这意味着对于某对j<kj如果aj+i−j−−−−√<ak+i−k−−−−√a_j+\sqrt{i-j}那么jj就再也没有用了。。。永世不得翻身你懂?
但是如果aj+i−j−−−−√>ak+i−k−−−−√a_j+\sqrt{i-j}>a_k+\sqrt{i-k}的话由于i−k−−−−√\sqrt{i-k}的增长速度比i−j−−−−√\sqrt{i-j}快所以还是可能存在某个时刻kk艹掉了jj。。。
那么我们可以开个set维护一个单调递减的决策队列。。。
对于决策队列中的每对点(j,k)(j,k),二分找到kk艹掉jj的位置,在那个位置开个vector把点对(j,k)(j,k)塞进去,表示这一时刻kk艹掉了jj
然后DP的时候枚举ii,先维护一下单调队列,然后处理发生在这一时刻的事件(j,k)(j,k),如果此时jj和kk都还在决策队列里,就用k<script id="MathJax-Element-3084" type="math/tex">k</script>一路往前艹过去

感觉这个写法确实可以用于所有决策单调。。。新技能get√

#include <set>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 500500
using namespace std;int n,a[M],_sqrt[M];int f[M],g[M];set<int> q;
vector<pair<int,int> > s[M]; int Bisection(int x,int y)//二分x在什么时候被y超过
{int l=y+1,r=n+1;while(r-l>1){int mid=l+r>>1;if( a[x]+sqrt(mid-x) < a[y]+sqrt(mid-y) )r=mid;elsel=mid;}return a[x]+sqrt(l-x) < a[y]+sqrt(l-y) ? l : r ;
}void DP(int f[])
{int i;for(i=1;i<=n;i++){if( *q.begin()!=5 )++i,--i;while( !q.empty() ){set<int>::iterator it=q.end();--it;if( a[*it]+sqrt(i-*it) < a[i] )q.erase(it);elsebreak;}if( !q.empty() ){set<int>::iterator it=q.end();--it;s[Bisection(*it,i)].push_back(make_pair(*it,i));}q.insert(i);while( !s[i].empty() ){int x=s[i].back().first,y=s[i].back().second;s[i].pop_back();if( q.find(y)==q.end() )continue;set<int>::iterator it=q.find(x);if( it==q.end() )continue;while(1){if( a[*it]+sqrt(i-*it) < a[y]+sqrt(i-y) ){if( it==q.begin() ){q.erase(it);break;}set<int>::iterator temp=it;it--;q.erase(temp);}else{s[Bisection(*it,y)].push_back(make_pair(*it,y));break;}}}set<int>::iterator it=q.begin();f[i]=max(f[i],a[*it]+_sqrt[i-*it]-a[i]);}
}int main()
{//freopen("pio.in","r",stdin);//freopen("pio.out","w",stdout);int i,j;cin>>n;for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=0;i*i<=n;i++)for(j=i*i+1;j<=(i+1)*(i+1)&&j<=n;j++)_sqrt[j]=i+1;DP(f);q.clear();for(i=1;i<=n+1;i++)s[i].clear();for(i=1;i<=n>>1;i++)swap(a[i],a[n-i+1]);DP(g);for(i=1;i<=n;i++)printf("%d\n",max(f[i],g[n-i+1]));return 0;}

BZOJ 2216 Poi2011 Lightning Conductor 动态规划相关推荐

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

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

  2. BZOJ2216: [Poi2011]Lightning Conductor

    第一道此类的题,所以这是一篇假的博客,定理不会证明不理性 也不一定对 我是从这篇博客看的 = = 很显然是让你求 p[i] = max{a[j] + sqrt(i - j)} - a[i] 就是 ma ...

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

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

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

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

  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. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special Judge Submit: 383  Solve ...

  7. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

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

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

  9. bzoj 2528: [Poi2011]Periodicity【kmp+构造】

    神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ #include<iostr ...

最新文章

  1. 我在中关村给不了你国贸的爱
  2. 应用程序进程(三):创建消息循环
  3. jstat -gcutil 输出结果分析_JVM故障分析
  4. MFC匿名管道原理详解、函数总结、调用实例(用MFC的匿名管道读取CMD输出内容)(C++语言)
  5. mysql lock trx id_MySQL中RR模式下死锁一例
  6. linux中的住设备号和次设备号
  7. SpringBoot Environment读取配置文件乱码
  8. 在pycharm中使用matplotlib时需要点❌才能显示下一张图片的问题
  9. jsp里table边框线_JSP好看表格边框
  10. 用php搭建微信公众号淘客三合一系统
  11. 成功学大师枭哥搞砸了,听懂掌声!
  12. Unity 个人玩法Demo合集
  13. 内核参数tcp_tw_reuse=2,对高并发的服务有影响吗?
  14. Linux学习笔记28——Linux的权限与密码管理机制
  15. LINUX------给系统加磁盘
  16. 常用的大数据技术有哪些?
  17. Mac电脑程序无响应怎么办?教你强制退出无响应程序
  18. SpringCloud简介及注册中心Eureka
  19. leetcode之Dota2参议院
  20. Java市场真的饱和了吗?到底Java都有什么优势

热门文章

  1. i5 10210u参数 i5 10210u相当于什么处理器
  2. php手机座机验证,JS校验手机号 座机 邮箱 微信号
  3. 软件加密系统Themida应用程序保护指南(十):高级选项
  4. 关于电脑黑屏后st-link下载不了的问题 Error: Flash Download failed - Target DLL has been cancelled
  5. 应届毕业生身份有什么用?应注意事项?
  6. 如何看待:Oracle Java SE 8 发行版更新 ? --- 变向激励学习 JDK 10 吗?
  7. 当linux中的所有指令突然不能使用的时候
  8. 1734: 炮兵阵地
  9. 云计算机可以玩游戏吗,4G网络可以流畅使用云电脑玩游戏吗
  10. C语言通过指针间接的实现函数返回多个值