当前位置: 首页 > news >正文

避雷针 Lightning Conductor

POI2011 避雷针 Lightning Conductor

题目传送门

题意

气候变化使 \(Byteburg\) 不得不建造一个大型避雷针来保护城市里的所有建筑物。建筑物恰好沿一条街,从 \(1\)\(n\) 编号。

建筑物的高度和避雷针的高度都是非负整数。\(Byteburg\)经费有限,只能建造一个避雷针。而且避雷针越高,价格越贵。

在建筑物 \(i\)(高度为 \(h_i\) )屋顶放置高为 \(p\) 的避雷针能够保护建筑物 \(j\) 的条件是:

\[h_j \le h_i + p - \sqrt{\lvert i - j \rvert}\]

其中 \(\lvert i - j \rvert\) 表示 \(i\)\(j\) 差的绝对值。

\(Byteburg\) 需要你帮它计算,如果在第\(i\)个建筑物的屋顶放置这样的避雷针的话,避雷针的最小高度是多少。

题解

感觉这题好套路啊……
显然的一个计算公式:
\[ h_i+p=Max \{ h_j+ \sqrt{ | i - j | } \}\]
于是我们就可以分前半部分和后半部分来算,最后取个\(Max\)。考虑前半部分,那么这个决策实际上是单调的。假设\(j<k\),如果\(h_j+\sqrt{ | i - j | } < h_k + \sqrt { | i - k |}\),那么\(j\)的决策是永远不会变成最优的。因为\(\sqrt{x}\)的增长速度比\(x\)要慢。于是我们就可以维护单调队列了。正着做一遍,反着做一遍就可以了。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+500;
typedef long long ll;
int n,tail,head;
ll h[N];
double ans[2][N];
struct node {
  int l,r,idx;
};
node que[N],nw;

double Calc(int x,int y) {
  return (double)h[x]+sqrt(abs(x-y))-h[y];
}

int Check(node x,int i) {
  double ans1=Calc(x.idx,x.l),ans2=Calc(i,x.l);
  return ans1<ans2;
}

void Solve(int tp) {
  head=0,tail=-1;
  for(int i=1;i<=n;i++) {
    if(head<=tail) {
      que[head].l++;
      if(que[head].l>que[head].r) ++head;
      if(head<=tail) {
        ans[tp][i]=Calc(que[head].idx,i);
      }
    }
    if(head>tail||Calc(que[tail].idx,n)<Calc(i,n)) {
      while(head<=tail&&Check(que[tail],i)) --tail;
      if(head<=tail) {
        int L=que[tail].l,R=que[tail].r,Ans=-1;
        while(L<R) {
          int Mid=(L+R)>>1;
          if(Calc(que[tail].idx,Mid)<Calc(i,Mid)) R=Mid-1;
          else L=Mid+1;
        }
        que[tail].r=L-1;
    `   que[++tail]=(node){L,n,i};
      }
      else que[++tail]=(node){i,n,i};
    }
  }
}

int main() {
  scanf("%d",&n);
  for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
  Solve(0);
  reverse(h+1,h+1+n);
  Solve(1);
  for(int i=1;i<=n;i++) {
    ll ret=ceil(max(ans[0][i],ans[1][n-i+1]));
    printf("%lld\n",max(0ll,ret));
  }
  return 0;
}

转载于:https://www.cnblogs.com/Apocrypha/p/10446032.html

相关文章:

  • 搭建Selenium-Grid环境
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring 之 第一个hellword
  • nodejs实现webservice问题总结
  • matlab2014在mac Yosemite下出现java空指针情况
  • DECLARE_MESSAGE_MAP 宏
  • Apache发布NetBeans 10.0,增强对JDK 11的支持
  • Shadow DOM 内部构造及如何构建独立组件
  • 打印二叉树某一层次的值(重点)
  • 单例模式中用volatile和synchronized来满足双重检查锁机制
  • getName和getSimpleName方法一般使用
  • 博客迁移:https://blog.llyweb.com
  • 20141102-微信.NET-笔记
  • Java知识体系梳理
  • java 一些容易忽视的小点-数据类型和运算符篇
  • 【Leetcode】101. 对称二叉树
  • Akka系列(七):Actor持久化之Akka persistence
  • Centos6.8 使用rpm安装mysql5.7
  • egg(89)--egg之redis的发布和订阅
  • es6要点
  • HTTP 简介
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mysql中InnoDB引擎中页的概念
  • PHP的Ev教程三(Periodic watcher)
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Yii源码解读-服务定位器(Service Locator)
  • 读懂package.json -- 依赖管理
  • 基于遗传算法的优化问题求解
  • 前端设计模式
  • 为什么要用IPython/Jupyter?
  • 学习笔记TF060:图像语音结合,看图说话
  • 06-01 点餐小程序前台界面搭建
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #laravel 通过手动安装依赖PHPExcel#
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (二十三)Flask之高频面试点
  • (分布式缓存)Redis持久化
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET处理HTTP请求
  • /var/log/cvslog 太大
  • @Autowired自动装配
  • [383] 赎金信 js
  • [Android]竖直滑动选择器WheelView的实现
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Angularjs]ng-select和ng-options
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [C#C++]类CLASS
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [Docker]五.Docker中Dockerfile详解
  • [Hive] CTE 通用表达式 WITH关键字