题面

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. 基于baseline、svd和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.3部分内容(其余部分会陆续补充上来).koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文章目 ...

  2. Lint found fatal errors while assembling a release target问题的解决方案

    此问题发生在编译为 release 版本时,出现错误提示如下: Lint found fatal errors while assembling a release target. To procee ...

  3. windows API 第 11 篇 GetCurrentDirectory SetCurrentDirectory

    GetCurrentDirectory函数获得当前文件所在的目录,并不是进程的目录(debug 和 release),它和GetCommandLine不同这里只讲 GetCurrentDirector ...

  4. day66作业

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 在sqlserver 的函数或存储过程中抛出异常(raiserror )

      raiserror的作用: raiserror 是用于抛出一个错误 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,sev ...

  6. JavaScript怎么解析后台传入的json字符串

    var data = "{'name': '张三', 'age': 23, 'gender': true}"; //json字符串 var jso = JSON.parse(dat ...

  7. leetcode 850. Rectangle Area II

    给定一些矩形2 求覆盖面积 矩形不超过200个 1 算法1 朴素思想 虽然朴素但是代码却有意思 利用容斥原理 复杂度高达 N*2^N class Solution: def intersect(rec ...

  8. 3.appium定位方法

    1.使用id定位: driver.find_element_by_id('id的名称').click() 2.使用className定位: driver.find_element_by_class_n ...

  9. CentOS 6.5安装libvirt启动不了libvirtd进程的错误

    今天安装kvm时遇到了一个libvirtd服务启动不了的问题,具体报错信息如下: 自己检查了一阵子,确定其他方面没有问题,在网上搜到了答案,在此整理下来: 再次启动服务,没有任何问题:

  10. 图片懒加载插件lazyload.js详解

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...