题面

GDOI是一个地处丘陵的小国,为了边防建设,国王希望在国界线上的某一座山峰上建立一座灯塔,照亮整个边界。而灯塔建设的调研工作,就交给了你。

GDOI的国境线上有N座连续的山峰,其中第i座的高度是hi。为了简单起见,我们认为这N座山峰排成了连续一条直线。

如果在第i座山峰上建立一座高度为p(p>=0)的灯塔,你会发现,这座灯塔能够照亮第j座山峰,当且仅当满足如下不等式:

hj <= hi + p - sqrt(|i - j|)

GDOI国王希望对于每一座山峰,你都能提供建造一座能够照亮全部其他山峰的灯塔所需要的最小高度。你能做到吗?

对于100%的数据满足\(1<N<=10^5,0<h_i<=10^9\)。

ST表做法

注意到\(sqrt(|i - j|)\)的取值最多\(\sqrt n\)种,我们对于每种取值,找出距离范围。

然后在这个范围内RMQ即可,可以用ST表

时间复杂度为\(O(n\sqrt n)\),ST表的复杂度是\(O(1)\)的。

分治做法

对于一个点,我们分开考虑左右两边的贡献。

在这里只讨论左边的贡献,右边则类似。

不难发现,本题具有决策单调性,具体来说:

对于一个点\(i\),设它的决策点是\(j\),那么任意\(i'>i\),都有决策点\(j'>j\)。

于是我们就可以分治解决。

对于\([l,r]\)区间,先算出\(mid\)的决策点\(p_{mid}\),那么左区间的决策点不超过\(p_{mid}\),右区间的决策点不小于\(p_{mid}\)。

时间复杂度为\(O(nlog_n)\)。

Code

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. #include<math.h>
  6. #define ll long long
  7. #define fo(i,x,y) for(int i=x;i<=y;i++)
  8. #define fd(i,x,y) for(int i=x;i>=y;i--)
  9. using namespace std;
  10. const int inf=0x7fffffff;
  11. const int maxn=100006;
  12. int n,h[maxn];
  13. double ans[maxn],Ans[maxn];
  14. double dis(int v,int u){return h[u]-h[v]+sqrt(abs(u-v));}
  15. void dfs(int l,int r,int L,int R){
  16. int mid=(l+r)/2,tmp=0;
  17. double tmd=-inf;
  18. if (l>r) return;
  19. fo(i,max(L,mid),R){
  20. double tmb=dis(mid,i);
  21. if (tmp==0 || tmb>tmd){
  22. tmp=i;
  23. tmd=tmb;
  24. }
  25. }
  26. ans[mid]=tmd;
  27. dfs(mid+1,r,tmp,R);
  28. dfs(l,mid-1,L,tmp);
  29. }
  30. void Dfs(int l,int r,int L,int R){
  31. int mid=(l+r)/2,tmp=0;
  32. double tmd=-inf;
  33. if (l>r) return;
  34. fo(i,L,min(mid,R)){
  35. double tmb=dis(mid,i);
  36. if (tmp==0 || tmb>tmd){
  37. tmp=i;
  38. tmd=tmb;
  39. }
  40. }
  41. Ans[mid]=tmd;
  42. Dfs(mid+1,r,tmp,R);
  43. Dfs(l,mid-1,L,tmp);
  44. }
  45. int main(){
  46. freopen("light.in","r",stdin);
  47. freopen("light.out","w",stdout);
  48. scanf("%d",&n);
  49. memset(ans,127,sizeof ans);
  50. memset(Ans,127,sizeof Ans);
  51. fo(i,1,n) scanf("%d",&h[i]);
  52. dfs(1,n,1,n);
  53. Dfs(1,n,1,n);
  54. fo(i,1,n){
  55. ll cans=max(0ll,(ll)max(ceil(Ans[i]),ceil(ans[i])));
  56. printf("%lld\n",cans);
  57. }
  58. return 0;
  59. }

【JZOJ4461】【GDOI2016模拟4.21】灯塔 分治的更多相关文章

  1. 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)

    [GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ...

  2. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)

    [GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...

  3. 牛客网 Wannafly挑战赛21 灯塔

    Z市是一座港口城市,来来往往的船只依靠灯塔指引方向.在海平面上,存在n个灯塔.每个灯塔可以照亮以它的中心点为中心的90°范围.特別地, 由于特殊限制,每个灯塔照亮范围的角的两条边必须要么与坐标轴平行要 ...

  4. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  5. BSOJ5458 [NOI2018模拟5]三角剖分Bsh 分治最短路

    题意简述 给定一个正\(n\)边形及其三角剖分,每条边的长度为\(1\),给你\(q\)组询问,每次询问给定两个点\(x_i\)至\(y_i\)的最短距离. 做法 显然正多边形的三角剖分是一个平面图, ...

  6. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  7. 【JZOJ4793】【GDOI2017模拟9.21】妮厨的愤怒

    题目描述 栋栋和标标都是厨力++的妮厨.俗话说"一机房不容二厨",他们两个都加入了某OI( )交流♂( )群,在钦定老婆的时候出现了偏差,于是闹得不可开交.可是栋栋是群内的长者,斗 ...

  8. 7.6 NOI模拟赛 灯 根号分治

    比较容易想的题目~ 容易发现 点亮一种颜色的贡献=新增灯的数量-已经存在的边的条数. 用线段树维护并不容易.暴力的话复杂度是\(Q\cdot n\)的. 考虑根号分治 只单纯考虑度数<B的点的话 ...

  9. 5.15 省选模拟赛 T1 点分治 FFT

    LINK:5.15 T1 对于60分的暴力 都很水 就不一一赘述了. 由于是询问所有点的这种信息 确实不太会. 想了一下 如果只是询问子树内的话 dsu on tree还是可以做的. 可以自己思考一下 ...

随机推荐

  1. python web 分页组件

    闲来无事便写了一个易使用,易移植的Python Web分页组件.使用的技术栈是Python.Django.Bootstrap. 既然是易使用.易移植的组件,首先介绍一下其在django框架中的调用方式 ...

  2. AppScan的基础使用

    AppScan是用于Web项目的安全测试工具,扫描网站所有url,自动测试是否存在各种类型的漏洞.AppScan安装在Windows环境上,版本越高,规则库越安全,扫描越全面.   1. 打开AppS ...

  3. Undertow服务器基础分析 - XNIO

    阅读更多 我们从名字上就能看出这是一个NIO思想为基础的IO框架,X是指这个框架可以有多种实现,我们可以从代码库 https://github.com/xnio 中发现一个项目xnio-native, ...

  4. 网络结构解读之inception系列一:Network in Network

    网络结构解读之inception系列一:Network in Network   网上有很多的网络结构解读,之前也是看他人博客的介绍,但当自己看论文的时候,发现存在很多的细节和动机解读,而这部分能加深 ...

  5. 修改linux命令行的提示符PS1

    # If not running interactively, don't do anything [ -z "$PS1" ] && return # check ...

  6. python第四课

    1.lambda()函数 可以直接定义一个函数,简化用def的定义. >>> func=lambda x,y:x+y>>> print(func(3,4))7> ...

  7. flex 手册摘要

    个人学习 摘抄翻译 http://www.cs.princeton.edu/~appel/modern/c/software/flex/flex.html#SEC1 程序的格式 分成显示的三部分 由% ...

  8. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

  9. 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)

    二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...

  10. TZOJ 4292 Count the Trees(树hash)

    描述 A binary tree is a tree data structure in which each node has at most two child nodes, usually di ...