bzoj3203【sdoi2013】保护出题人
题目描述

输入格式
第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离。接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的僵尸,排头僵尸从距离房子Xi米处开始接近。
输出格式
一个数,n关植物攻击力的最小总和 ,保留到整数。
数据范围及提示
对于100%的数据, 1≤n≤10^5,1≤d≤10^12,1≤x≤ 10^12,1≤a≤10^12
题解:
- 需要先分析一个是否合法的判定规则:
- 由于一只僵尸被杀死后会立刻攻击后面的僵尸,所以只要对于每一个僵尸满足可以杀死即可;
- 考虑到第$n$关,最小可防御的攻击力$y_{n}$即:$max \{ \frac{sum_{i}}{x+(i-1)d} \}: \ 1 \le i \le n \ $;
- 所以求出每关最小的$y_{n}$加起来,考虑快速求每关的$y_{n}$;
- 和题目中的加入顺序搭配一下即:$\frac{ sum_{n} - sum_{i-1} }{ x + (n-i)d }$;
- 即:$\frac{sum_{n} - sum{i-1}}{ x + nd - id }: 1 \le i \le n $;
- 可以看成定点$P(sum_{n},x+nd)$和点群$S:(sum_{i-1},id)$的斜率最大值;
- 注意到$S_{n}$一定在$S_{i}:1 \le i \lt n$的右上方,同时$P$一定在当前$S$的右上方;
- 所以对$S$维护一个下凸包,凸包上的点和$P$的斜率满足单峰函数;
- 三分求值;
#include<cstdio>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
const int N = ;
const double eps = 1e-;
ll n,d,m;
double x,sum[N],ans;
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
ll rd(){
ll x = ; char c = gc();
while(c<''||c>'') c = gc();
while(c>=''&&c<='') x = x * + c - '',c = gc();
return x;
}
struct point{
double x,y;
point(){}
point(double x,double y):x(x),y(y){}
point operator -(const point &a){return point(x-a.x,y-a.y);}
}ch[N],P,p;
int dcmp(double x){return (fabs(x)<eps)?:x<?-:;}
double Cro(point a,point b){return a.x*b.y - b.x*a.y;}
double calc(point a){return a.y/a.x;}
int main()
{ //freopen("bzoj3203.in","r",stdin);
//freopen("bzoj3203.out","w",stdout);
n = rd(); d = rd();
for(int i = ;i <= n;i++){
sum[i] = rd() + sum[i-]; x = rd();
p = point(d*i,sum[i-]);
while(m>&&Cro(ch[m]-ch[m-],p-ch[m])<=) m--;
ch[++m] = p;
P = point(x+i*d,sum[i]);
int l = ,r = m;
while(r-l>=){
int Len = (r-l)/,mid1 = l + Len,mid2 = r - Len;
if(dcmp(calc(P-ch[mid1])-calc(P-ch[mid2]))<=) l = mid1; else r = mid2;
}
double mx = ;
for(int j = l;j <= r;j++) mx = max(calc(P-ch[j]),mx);
ans += mx;
}
printf("%.0lf\n",ans);
return ;
}//by tkys_Austin;bzoj3203
bzoj3203【sdoi2013】保护出题人的更多相关文章
- [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)
[BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...
- BZOJ3203 SDOI2013保护出题人(三分)
给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值.这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率. 脑补一条直线不断减小斜率 ...
- [BZOJ3203][SDOI2013]保护出题人(凸包+三分)
https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...
- [bzoj3203][Sdoi2013]保护出题人
人生第一道三分?... 把进攻序列里的前i只僵尸看成一个点,横坐标是第i只僵尸到达的时间,纵坐标是这i只僵尸的血量总和..就是说植物必须在这段时间内输出这些伤害..那么单位时间的输出伤害就是斜率了. ...
- 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包
[BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
- 【BZOJ3203】保护出题人(动态规划,斜率优化)
[BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...
- [SDOI2013]保护出题人
题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...
- 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分
题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...
- BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)
惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...
随机推荐
- RAID中条带的概念
raid把数据分成条带,一个条带横跨所有数据磁盘,每个磁盘上存储条带的一部分,称为sagment,也称为条带深度.一个条带包含的扇区或块的个数,称为条带长度. raid向操作系统提供的是卷,是连续的扇 ...
- MyBatis学习(一)————纯jdbc编程
什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- 软件项目第一次Sprint评价
1.9-652 首先该小组在第一个冲刺阶段的目标还是很明确的,按照这个目标去完成并实现任务,最后也确实是实现了.通过展示目前已经完成了界面的设计及实现.初步的游戏人物设定.生命值设定.除了完成的这些, ...
- Task 6.4 冲刺Two之站立会议9
今天主要对昨天用户提出的意见加以改进,虽然有些不能轻易实现但是仍然查阅了很多资料.因为他目前可以实现实时通信的功能,而我们想要在这个基础上实现临时的视频聊天的功能,但是时间有点紧迫,所以还没有实现.
- CMD命令操作符
cmd command的缩写,是windows环境下的虚拟DOS窗口,提供有DOS命令,功能强大 mstsc 远程 inetmgr ...
- 特别好用的eclipse快捷键
alt+/ 提示 alt+shift+r重命名 alt+shift+j添加文档注释 Ctrl+shift+y小写 Ctrl+shift+x大写 ctrl+shift+f格式化代码(需要取消输入法的简繁 ...
- Date 类的使用
package com.Date.Math; import java.text.ParseException; import java.text.SimpleDateFormat; import ja ...
- Git管理分支
管理分支:git branch 直至现在为止,我们的项目版本库一直都是只有一个分支 master.在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支.下面列举一些常见的分支策略, ...
- ubuntu16.04+matlab r2015b VideoReader报错
读取.mp4出错 需要安装gstreamer0.10-ffmpeg ` sudo add-apt-repository ppa:mc3man/gstffmpeg-keep sudo apt-get u ...
- HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 Genghis Khan the Conqueror Time Limit: 10000/50 ...