题面

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. PostgreSQL的基础数据类型分析记录-转

    src:http://www.codeweblog.com/postgresql%E7%9A%84%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E ...

  2. [51nod-1364]最大字典序排列

    [51nod-1364]最大字典序排列 Online Judge:51nod-1364 Label:线段树,树状数组,二分 题目描述 题解: 根据题意很容易想到60%数据的\(O(N^2logN)\) ...

  3. idea debug技巧

    1 给对象设置值

  4. Django中间件分析

    SessionMiddleware 浏览器会发送包含SESSION_COOKIE_NAME的的Cookie 中间件从django_session中按照SESSION_COOKIE_NAME取出存入的s ...

  5. location.hash的不一样用法

    除了可以当做锚点,定位到同name位置,location.hash还有两个用法. 平时开发都会用得到. 一:使js事件在浏览器中产生历史记录. 举个栗子: 我们在JS里面改变了页面的数据.样式等,比如 ...

  6. 深入浅出 Java Concurrency (20): 并发容器 part 5 ConcurrentLinkedQueue[转]

    ConcurrentLinkedQueue是Queue的一个线程安全实现.先来看一段文档说明. 一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序.队列的头部 是队 ...

  7. mysql中的字符集和校对规则(mysql校对集)

    1.简要说明介绍 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则. MySql在collation提供较强的支持,oracel在这方面没查到相应的资料. 不同字符 ...

  8. JDK、Eclipse、Tomcat、Maven、IDEA 常见问题

    windows操作分成了32位和64位的系统,不同的系统安装的软件也不一样. 查询电脑操作系统是多少位? J D K 01. 下载安装 02. 目录解释 03. 配置环境变量 (JDK安装成功后进行配 ...

  9. 给docker里的php安装gd扩展

    docker官方镜像为安装php扩展封装了函数,为开发者提供了很大的便利,以下以Dockerfile的形式演示安装gd扩展的方法,安装gd扩展需要安装几个依赖包,安装依赖包使用系统命令,安装命令根据基 ...

  10. apache支持多主机头,并防止恶意空主机头的配置实现

    首先,需要启用 LoadModule vhost_alias_module modules/mod_vhost_alias.so # Virtual hostsInclude conf/extra/h ...