题面

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

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const int inf=0x7fffffff;
const int maxn=100006;
int n,h[maxn];
double ans[maxn],Ans[maxn];
double dis(int v,int u){return h[u]-h[v]+sqrt(abs(u-v));}
void dfs(int l,int r,int L,int R){
int mid=(l+r)/2,tmp=0;
double tmd=-inf;
if (l>r) return;
fo(i,max(L,mid),R){
double tmb=dis(mid,i);
if (tmp==0 || tmb>tmd){
tmp=i;
tmd=tmb;
}
}
ans[mid]=tmd;
dfs(mid+1,r,tmp,R);
dfs(l,mid-1,L,tmp);
}
void Dfs(int l,int r,int L,int R){
int mid=(l+r)/2,tmp=0;
double tmd=-inf;
if (l>r) return;
fo(i,L,min(mid,R)){
double tmb=dis(mid,i);
if (tmp==0 || tmb>tmd){
tmp=i;
tmd=tmb;
}
}
Ans[mid]=tmd;
Dfs(mid+1,r,tmp,R);
Dfs(l,mid-1,L,tmp);
}
int main(){
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
scanf("%d",&n);
memset(ans,127,sizeof ans);
memset(Ans,127,sizeof Ans);
fo(i,1,n) scanf("%d",&h[i]);
dfs(1,n,1,n);
Dfs(1,n,1,n);
fo(i,1,n){
ll cans=max(0ll,(ll)max(ceil(Ans[i]),ceil(ans[i])));
printf("%lld\n",cans);
}
return 0;
}

【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学习笔记4.1_检测和过滤异常值

    1.查看数据分布data.describe() 2.找出某列中符合筛选条件的值 3.找出符合筛选条件的行 4.用np.sign(data)*3设置绝对值的标准 data[np.abs(data)> ...

  2. PKU--3211 Washing Clothes(01背包)

    题目http://poj.org/problem?id=3211 分析:两个人洗衣服,可以同时洗,但是只能同时洗一种颜色. 要时间最短,那么每一种颜色的清洗时间最短. 转换为,两个人洗同一种颜色的衣服 ...

  3. leetcode 996. Number of Squareful Arrays

    给定一个长度小于 12 的数组 要求排列方式的种数 使得相邻和为完全平方 不考虑数学结构 将问题转化为 一笔画问题 和为完全平方代表 之间存在通路 回溯法 N^N 记忆化搜索 NN 2^N 判断是否是 ...

  4. ubuntu关闭防火墙(默认命令)

  5. Jenkins自动部署springboot项目

    说明: 该示例为在windows系统下自动化部署springboot 架构: springboot + github + gradle + jdk8 各种配置步骤及截图说明: 1.配置git,grad ...

  6. Elasticsearch系列(二)--query、filter、aggregations

    本文基于ES6.4版本,我也是出于学习阶段,对学习内容做个记录,如果文中有错误,请指出. 实验数据: index:book type:novel mappings: { "mappings& ...

  7. MaxCompute,基于Serverless的高可用大数据服务

    摘要:2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永明为大家分享了 ...

  8. 阿里云 Aliplayer高级功能介绍(九):自动播放体验

    基本介绍 经常会碰到客户询问,为什么我设置了autoplay为true,但是没有自动播放,每次都要向客户解释这个是浏览器从用户体验角度考虑做的限制,客户会继续询问那我要怎么做? 针对这个问题Alipl ...

  9. 编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成

    编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成.“组合 ”的规则如下: 1). str中的每个字母要么来自于part1,要么来自于part2 ...

  10. 微信小程序——页面滑动事件

    wxml: <view id="id" class = "ball" bindtap = "handletap" bindtouchs ...