解题思路

CDQ优化DP

下文中 \(pos_i\) 表示编号为 \(i\) 的位置或者说坐标。

暴力 DP 转移方程是 \(f_i=\min\limits_{1\le j<i}\{f_j+\dfrac{pos_i-pos_j}{2\sqrt{r_j}}\}+val_i\)

这样直接转移是 \(\mathcal{O}(n^2)\) 的,时间无法接受,尝试优化一下柿子。

对于 \(r_j>r_k\) 并且 \(j\) 优于 \(k\) 的条件就是:

\[f_j+\dfrac{pos_i-pos_j}{2\sqrt{r_j}}<f_k+\dfrac{pos_i-pos_k}{2\sqrt{r_k}}
\]
\[2\times \sqrt{r_jr_k}(f_j-f_k)<-pos_i\sqrt{r_k}+pos_j\sqrt{r_k}+pos_i\sqrt{r_j}-pos_k\sqrt{r_j}
\]
\[pos_i(\sqrt{r_j}-\sqrt{r_k})>2\sqrt{r_jr_k}(f_j-f_k)-pos_j\sqrt{r_k}+pos_k\sqrt{r_j}
\]
\[-pos_i<\dfrac{(2\times f_j-\frac{pos_j}{\sqrt{r_j}})-(2\times f_k-\frac{pos_k}{\sqrt{r_k}})}{\frac{1}{\sqrt{r_j}}-\frac{1}{\sqrt{r_k}}}
\]

然后我们就可以让 x 轴表示 \(\dfrac{1}{\sqrt{r_i}}\) y 轴表示 \(2\times f_i-\dfrac{pos_i}{\sqrt{r_i}}\)

由于 \(pos\) 具有单调性,因此我们只需要 CDQ ,并且对于左区间以 \(r\) 为关键字进行排序,单调队列维护就好了。

对于每一个 \(\dfrac{1}{\sqrt{r}}\) 可以预处理,时间复杂度: \(\mathcal{O}{nlog^2n}\),好像无法用归并排序减去一个 \(log\)。

注意变量的类型不然就会 100pts -> 17pts。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e5+10,INF=2e18;
int n,m,q[N],pos[N];
double f[N],ans=INF,c[N];
struct Node{int pos,r,val,id;double c;}s[N];
bool comp(Node x,Node y){return x.r<y.r;}
double g(int x){return 2.0*f[x]-(1.0*pos[x])*c[x];}
void CDQ(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>1,head=1,tail=0; CDQ(l,mid);
sort(s+l,s+mid+1,comp);//对于左区间进行排序
for(int i=l;i<=mid;i++)//单调队列处理左区间可能的答案
{
while(head<tail&&(g(s[i].id)-g(s[q[tail]].id))*(s[q[tail]].c-s[q[tail-1]].c)>=(g(s[q[tail]].id)-g(s[q[tail-1]].id))*(s[i].c-s[q[tail]].c)) tail--;
q[++tail]=i;
}
for(int i=mid+1;i<=r;i++)//处理右区间答案
{
while(head<tail&&g(s[q[head+1]].id)-g(s[q[head]].id)<-s[i].pos*(s[q[head+1]].c-s[q[head]].c)) head++;
f[s[i].id]=min(f[s[i].id],(f[s[q[head]].id]+(1.0*s[i].pos-1.0*s[q[head]].pos)*s[q[head]].c/2.0)+s[i].val);
}
CDQ(mid+1,r);
}
signed main()
{
n=read(); m=read();
for(int i=1,r,val;i<=n;i++)
{
pos[i]=read(); r=read(); val=read(); f[i]=INF;
if(!r){i--;n--;continue;}
s[i]=(Node){pos[i],r,val,i,1.0/sqrt(r)}; c[i]=1.0/sqrt(r);
}
f[1]=s[1].val; CDQ(1,n);
for(int i=1;i<=n;i++)
if(s[i].pos+s[i].r>=m)
ans=min(ans,f[s[i].id]);//计算答案
printf("%.3lf",ans);
return 0;
}

题解 P2497 [SDOI2012]基站建设的更多相关文章

  1. 【转帖】5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个

    5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个 https://www.laoyaoba.com/html/news/newsdetail?source=pc&news_id=73 ...

  2. Problem 3 基站建设 (station.cpp)———2019.10.6

    在此郑重的感激wxyww大佬 wxyww tql [题目描述]小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通信工程建设任务,他们需要在 C 城建设一批新的基站.C 城的城市规划做 ...

  3. 【csp模拟赛4】基站建设 (station.cpp)

    [题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...

  4. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  5. [转帖]5G网速那么快,基站辐射会很大吗?

    5G网速那么快,基站辐射会很大吗? 鲜枣课堂 2019-04-20 21:19收藏55评论6社交通讯     题图来自东方IC,本文来自微信公众号:鲜枣课堂(ID:xzclasscom),作者:小枣君 ...

  6. 惠州发布5G任务计划表,将出台智慧灯杆建设计划与技术规范

    广东省惠州市于近日发布<惠州市贯彻落实广东省加快5G产业发展行动计划(2019-2022年)工作任务计划表>(以下简称:<5G任务计划表>). <5G任务计划表>明 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 读书笔记---PMBOK第五版官方中文版

    以下是为了准备PMP考试时学习<PMBOK第五版官方中文版>这本书的笔记和摘要,目的是为了以后可以快速的抓住本书的核心重点复习. 引论 PMPOK的目的 收录了项目管理知识体系中被普遍认可 ...

  9. wifi与wimax

    这几天在看文献中看到802.11a,802.11n和802.16e这几种无信通信协议标准,在网上查了相关资料后,看到有个帖子总结得不错,故将其转载过来. 转:http://blog.csdn.net/ ...

  10. 4G来临 IT业转型之路当在不远

    摘 要:4G商用未启,品牌营销争夺已经展开.目前,除了中国移动推出全新4G品牌“andM”之外,中国电信和中国联通均选择继续沿用3G的品牌. 4G商用未启,品牌营销争夺已经展开.12月10日,中国电信 ...

随机推荐

  1. mysql 必知必会整理—数据汇总与分组[七]

    前言 简单整理一下数据汇总与分组 正文 我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分析和报表生成. 这种类型的检索例 ...

  2. 当年老夫手写的cookie

    前言 留来来只为了回忆,旧博客迁移. 正文 /** * Created by OC on 20xx/8/27. */ function setCookie(name,value,expires,pat ...

  3. c# aspose操作word文档

    背景 这个是一个操作word文档的插件 1.1插入图片 using Aspose.Words; using Aspose.Words.Drawing; using Aspose.Words.Rende ...

  4. 深入探讨下SSR与CSR有啥不同

    随着互联网技术的迅速发展,用户对网页的加载速度和交互体验有了更高的期待.作为开发者,我们常常需要在服务器端渲染(SSR)与客户端渲染(CSR)之间做出选择.这两种渲染方式各有特点,适用于不同的场景和需 ...

  5. 如何发起 MQTT 亿级连接和千万消息吞吐性能测试

    ​简介:MQTT 协议凭借简单易实现.支持 QoS.报文小等特点,占据了物联网协议的半壁江山. 作者:亦炎 随着 5G 时代的来临,万物互联的伟大构想正在成为现实.联网的物联网设备 在 2021 年已 ...

  6. 使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

    简介: 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用.最近,在优化接口的响应时间,优化了代码之后,但是时间还是达不到要求:有一个 ...

  7. 喜马拉雅 Apache RocketMQ 消息治理实践

    ​简介:本文通过喜马拉雅的RocketMQ治理实践分享,让大家了解使用消息中间件过程中可能遇到的问题,避免实战中踩坑. 作者:曹融,来自喜马拉雅,从事微服务和消息相关中间件开发. ​ 本文通过喜马拉雅 ...

  8. KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

    简介: 在这篇博文中,我们将简要解释需要考虑的领域,KEDA 如何使应用自动伸缩变得简单,以及为什么阿里云企业分布式应用服务(EDAS)在 KEDA 上完全标准化. 联合作者 | Yan Xun,阿里 ...

  9. MySQL 深潜 - 一文详解 MySQL Data Dictionary

    ​简介: 在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复 ...

  10. [FE] Canvas 转图片并下载的方式

    先获取 canvas 节点,使用 toDataURL 转为 image 数据,最后使用 a 链接下载. // Trans to image const canvas = document.getEle ...