【JZOJ4461】【GDOI2016模拟4.21】灯塔 分治
题面
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】灯塔 分治的更多相关文章
- 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)
[GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ...
- 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
[GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...
- 牛客网 Wannafly挑战赛21 灯塔
Z市是一座港口城市,来来往往的船只依靠灯塔指引方向.在海平面上,存在n个灯塔.每个灯塔可以照亮以它的中心点为中心的90°范围.特別地, 由于特殊限制,每个灯塔照亮范围的角的两条边必须要么与坐标轴平行要 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- BSOJ5458 [NOI2018模拟5]三角剖分Bsh 分治最短路
题意简述 给定一个正\(n\)边形及其三角剖分,每条边的长度为\(1\),给你\(q\)组询问,每次询问给定两个点\(x_i\)至\(y_i\)的最短距离. 做法 显然正多边形的三角剖分是一个平面图, ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 【JZOJ4793】【GDOI2017模拟9.21】妮厨的愤怒
题目描述 栋栋和标标都是厨力++的妮厨.俗话说"一机房不容二厨",他们两个都加入了某OI( )交流♂( )群,在钦定老婆的时候出现了偏差,于是闹得不可开交.可是栋栋是群内的长者,斗 ...
- 7.6 NOI模拟赛 灯 根号分治
比较容易想的题目~ 容易发现 点亮一种颜色的贡献=新增灯的数量-已经存在的边的条数. 用线段树维护并不容易.暴力的话复杂度是\(Q\cdot n\)的. 考虑根号分治 只单纯考虑度数<B的点的话 ...
- 5.15 省选模拟赛 T1 点分治 FFT
LINK:5.15 T1 对于60分的暴力 都很水 就不一一赘述了. 由于是询问所有点的这种信息 确实不太会. 想了一下 如果只是询问子树内的话 dsu on tree还是可以做的. 可以自己思考一下 ...
随机推荐
- 02_springmvc处理器映射器和适配器(补充)
一.非注解的处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain ...
- 在VisualSVN创建新的Repository
1,右键-创建 2,(暂时还没明白这两个选项的区别,暂时先使用第一个) 3, 库名称 4,(也不懂具体含义, 先默认) 5, 权限问题 6, 在需要用到这个库的工作文件夹内点击右键: -SVN检出 7 ...
- Python学习之--数据基础
对于Python来说,一切皆对象.包括数字.字符串.列表等,对象是由类来创建的,那对象的一个优点就是可以使用其创建类中所定义的各种方法. 查看对象/方法 1)可以在命令行中直接查看,如下: >& ...
- Leetcode513. Find Bottom Left Tree Value找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输出: 7 注意: 您可以假 ...
- vs2013+opencv2410的一些问题
1.设置microsoft.user时,debug和relaese只能修改一次,相对应的32和64会相应修改,因此可以新建一个属性表,命名为OpenCV2410debug: 2.报错:error LN ...
- VirtualBox安装CentOS后分辨率和鼠标无缝切换问题
问题:VirtualBox安装完后出现分辨率只有800*600和1024*768,鼠标不能在虚拟机和本机件无缝切换. 解决办法:在终端中执行以下命令 yum install kernel yum in ...
- SpringData初探
前言 项目中用到这个,没有学过,手动搭建,测试执行流程, 理论的东西有时间再补充 Maven依赖 <?xml version="1.0" encoding="UTF ...
- IO流19(完) --- RandomAccessFile实现数据的插入 --- 技术搬运工(尚硅谷)
原hello.txt文件中的内容:abcdefghijklmn 想要实现的效果是,将xyz插入到abc后面,将文件内容变成:abcxyzdefghijklmn @Test public void te ...
- nodejs+express 初学(三)
Nodejs 的模块,nodejs中每一个js文件都是独立的,不用担心他们中的变量会相互覆盖 模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个Node.js 文件就 ...
- struts2-环境搭建-访问流程-配置详解-常量配置-类详解
1 struts2概述 1.1 概念 1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...