洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人
题目描述
出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了。
参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家。而你作为SDOI2013的参赛者,你需要保护出题人铭铭。
僵尸从唯一一条笔直道路接近,你们需要在铭铭的房门前放置植物攻击僵尸,避免僵尸碰到房子。
第一关,一只血量为\(a_1\)点的墦尸从距离房子\(x_1\)米处速接近,你们放置了攻击力为\(y_1\)点/秒的植物进行防御;第二关,在上一关基础上,僵尸队列排头增加一只血量为\(a_2\)点的僵尸,与后一只僵尸距离\(d\)米,从距离房\(x_2\)米处匀速接近,你们重新放置攻击力为\(y_2\)点/秒的植物;……;第\(n\)关,僵尸队列共有\(n\)只僵尸,相邻两只僵尸距离\(d\)米,排头僵尸血量为\(a_n\)点,排第二的 僵尸血量\(a_{n-1}\),以此类推,排头僵尸从距离房子\(x_n\)米处匀速接近,其余僵尸跟随排头同时接近,你们重新放置攻击力为\(y_n\)点/秒的植物。
每只僵尸直线移动速度均为\(1\)米/秒,由于植物射击速度远大于僵尸移动速度,可忽略植物子弹在空中的时间。所有僵尸同时出现并接近,因此当一只僵尸死亡后,下一只僵尸立刻开始受到植物子弹的伤害。
游戏得分取决于你们放置的植物攻击力的总和\(\sum \limits _{i=1} ^{n} y_i\),和越小分数越高,为了追求分数上界,你们每关都要放置攻击力尽量小的植物。
作为SDOI2013的参赛选手,你们能保护出题人么?
输入输出格式
输入格式:
第一行两个空格隔开的正整数\(n\)和\(d\),分别表示关数和相邻僵尸间的距离。
接下来\(n\)行每行两个空格隔开的正整数,第\(i + 1\)行为\(A_i\)和 \(X_i\),分别表示相比上一关在僵尸队列排头增加血量为\(A_i\) 点的僵尸,排头僵尸从距离房子\(X_i\)米处开始接近。
输出格式:
一个数,\(n\)关植物攻击力的最小总和 ,保留到整数。
说明
对于\(100\%\)的数据, \(1\le n\le 10^5,1\le d\le 10^{12},1\le x\le 10^{12},1\le a\le10^{12}\)
我自己只有一个naive的想法
整体二分,然后对在里面搞凸包弄一弄,感觉是可以做的,但是懒得写。
正解
设\(n\)个僵尸的前缀血量和为\(hp_i\),第\(i\)个僵尸为开头时距离房间为\(X_i\)
\]
然后对前\(i\)个僵尸组成的波,维护点集\((i\times d,hp_i-1)\)的一个凸壳
然后每次询问\((hp_p,X_i+p\times d)\)与凸壳上一个点的最大斜率,直接三分就可以了
关于整数域上的三分,和二分一样写其实就可以,而且更快
Code:
#include <cstdio>
#include <algorithm>
const int N=1e5+10;
#define mp(a,b) std::make_pair(a,b)
std::pair <double,double> yuu[N];
int s[N],tot,n;
double hp[N];
double slope(int a,int b)
{
return (yuu[b].second-yuu[a].second)/(yuu[b].first-yuu[a].first);
}
void ins(double x,double y)
{
yuu[++n]=mp(x,y);
while(tot>1&&slope(n,s[tot])<slope(s[tot],s[tot-1])) --tot;
s[++tot]=n;
}
double qry(double x,double y)
{
int l=1,r=tot;
yuu[0]=mp(x,y);
while(l<r)
{
int mid=l+r>>1;
if(slope(0,s[mid])<slope(0,s[mid+1])) l=mid+1;
else r=mid;
}
return slope(0,s[l]);
}
int main()
{
int n;double d,ans=0;
scanf("%d%lf",&n,&d);
for(int i=1;i<=n;i++)
{
double a,x;
scanf("%lf%lf",&a,&x);
hp[i]=hp[i-1]+a;
ins(i*d,hp[i-1]);
ans+=qry(x+i*d,hp[i]);
}
printf("%.0f\n",ans);
return 0;
}
2019.2.14
洛谷 P3299 [SDOI2013]保护出题人 解题报告的更多相关文章
- BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)
惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...
- P3299 [SDOI2013]保护出题人
传送门 全世界都会二分可海星-- 首先记\(sum[i]\)为\(a[i]\)的前缀和,那么第\(i\)个的答案就是\(max\{\frac{sum[i]-sum[j-1]}{x+(i-j)d}\}\ ...
- 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包
[BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...
- [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)
[BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...
- [SDOI2013]保护出题人
题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...
- BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)
洛谷传送门 题目大意:太长略 每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即从头开始每一段僵尸都需要在规定距 ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...
- [bzoj3203][Sdoi2013]保护出题人
人生第一道三分?... 把进攻序列里的前i只僵尸看成一个点,横坐标是第i只僵尸到达的时间,纵坐标是这i只僵尸的血量总和..就是说植物必须在这段时间内输出这些伤害..那么单位时间的输出伤害就是斜率了. ...
随机推荐
- 轻量级WebApi请求插件:PostMan
时间很宝贵,废话不多说,只说三句,如下: 十年河东,十年河西,莫欺骚年穷!~_~ 打错个字,应该是莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来. 学无止境,精益求精. 本次介绍的 ...
- 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常
新版开发者工具增加了https检查功能:可使用此功能直接检查排查ssl协议版本问题: 可能原因:0:后台域名没有配置0.1:域名不支持https1:没有重启工具:2:域名没有备案,或是备案后不足24小 ...
- 校内模拟赛 SovietPower Play With Amstar
SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...
- Zookeeper Windows版的服务安装和管理工具
以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈).然后遇到了多个一模一样但是同时运行的服务.不同服务但依赖同相同的配置数据(前端网页服务:Nginx+IIS+nodejs. ...
- Flutter - 自动生成Android & iOS图标
对于要发布的app来说,做图标是一个麻烦的事,你需要知道N个图标的分辨率,然后用PhotoShop一个个修改导出. PS好图标之后,按照各自的位置放进去. ********************** ...
- Python自动化运维工具-Fabric部署及使用总结
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- 《Linux内核设计与实现》第一二章笔记
第一章 linux内核简介 每个处理器在任何时间点上的活动必然概括为下列三者: 运行于用户空间,执行用户进程 运行于内核空间,处于进程上下文,代表某个特定的进程执行 运行于内核空间,处于中断上下文,与 ...
- 《Linux内核分析》第七周: 可执行程序的装载
LINUX内核分析第七周学习总结--可执行程序的装载 杨舒雯(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...
- 『编程题全队』Beta 阶段冲刺博客三
1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.添加登录框的功能 2.修改登录框的UI 孙慧君: 1.提醒显示UI设计: 2 ...
- [日常工作]Oracle新增数据文件的小知识点
1. 表空间是small file tablespace的 然后数据文件长到了32g左右之后无法再次扩充, 应用报错了 为了性能和最快的处理 使用语句 alter tablespace user ad ...