解题思路

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. gitee基于webhooks实现前端简单自动化部署

    1.为什么采用自动化部署 简而言之,程序员优秀传统:懒 =>高级生产力. 基于gitee进行的自动化部署,服务器环境为Ubuntu 基于webhooks进行的自动化部署更加轻快便捷 2.部署步骤 ...

  2. 快速获取使用dblink的视图的全部字段

    快速获取使用dblink的视图的全部字段 默认情况下,使用dblink连接的视图在PL/SQL是没法通过代码助手获取全部的字段的 如果要获取全部字段的话,可以使用一个奇怪的方法 对要获取的使用dbli ...

  3. OceanBase初体验之从MySQL迁移数据到OceanBase集群

    前置条件 MySQL 环境 OceanBase 环境 测试用的表结构和一些数据 先在源端 MySQL 用如下脚本创建测试表,以及写入10000条数据用于迁移测试. use test; CREATE T ...

  4. 3千字带你搞懂XXL-JOB任务调度平台

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 一.概述 在平时的业务场景中,经常有一些场景需要使用定时任 ...

  5. EasyNLP开源|中文NLP+大模型落地,EasyNLP is all you need

    ​简介:EasyNLP背后的技术框架如何设计?未来有哪些规划?今天一起来深入了解. 作者 | 临在.岑鸣.熊兮 来源 | 阿里开发者公众号 一 导读 随着BERT.Megatron.GPT-3等预训练 ...

  6. OceanBase时序数据库CeresDB正式商用 为用户提供安全可靠的数据存储管理服务

    简介: OceanBase完成OLAP和OLTP双重能力并行后,向数据管理领域多模方向迈出第一步. 近日,在数据库OceanBase3.0峰会上,OceanBase CEO杨冰宣布首个时序数据库产品C ...

  7. [GPT] swoole的协程和golang的协程有什么区别,哪个更好

    Swoole 的协程和 Golang(Go 语言)的协程(Goroutine)在概念上都是为了实现轻量级的并发编程,但它们在具体实现.使用方式和性能特点上有所不同: 实现原理: Golang 协程(G ...

  8. [FAQ] puppeteer 清空输入框的值 并 重新输入

    一种方式是,清空输入框可以通过如下注入代码实现,但是可能存在 和页面本身的操作 存在优先级问题. await page.evaluate( () => document.getElementBy ...

  9. Etcd 可视化管理工具,GUI 客户端。

    Etcd Assistant--Etcd 可视化管理工具,GUI 客户端. 下载地址:http://www.redisant.cn/etcd 主要功能: 支持多标签页,同时连接到多个集群 以漂亮的格式 ...

  10. Python中强大的通用ORM框架:SQLAlchemy

    Python中强大的通用ORM框架:SQLAlchemy https://zhuanlan.zhihu.com/p/444930067