bzoj3203
好题,我们先来考虑第i关,要能打死所有僵尸的攻击力得要满足什么条件
我们设排头的是第i个僵尸,植物这关攻击力为yi
不难得到对于第j个僵尸,植物开始打到他时,他离房子的距离为xi+(i-j)*d-(sum[i]-sum[j])/yi
(sum[]表示僵尸的血量前缀和)
也就是aj/yi<=xi+(i-j)*d-(sum[i]-sum[j])/yi,整理可得
yi>=(sum[i]-sum[j-1])/(xi+(i-j)*d)
也就是我们要求yi=max(sum[i]-sum[j-1])/(xi+(i-j)*d))看到这个立马想到斜率优化
我们把(sum[j-1],j*d)看作一个状态点,也就是问一个点(sum[i],xi+i*d)和前面点斜率的最大值
注意状态点坐标都是单调的,画图不难发现上凸的点是没有意义的,我们要维护一个下凸线
对于询问,我们发现和状态点构成的斜率是单调的,因此我们可以用三分来求
注意这里的三分是整数的三分,要小心
type node=record
x,y:int64;
end; var i,n,t:longint;
d,h,x:int64;
s:array[..] of int64;
q:array[..] of longint;
a:array[..] of node;
now:node;
ans:double;
function getk(i,j:longint):double;
begin
exit((a[j].y-a[i].y)/(a[j].x-a[i].x));
end; function max(a,b:double):double;
begin
if a>b then exit(a) else exit(b);
end; function calc(j:longint):double;
begin
exit((now.y-a[j].y)/(now.x-a[j].x));
end; function ask:double;
var l,r,m:longint;
begin
l:=;
r:=t;
while l+<r do
begin
m:=(r-l+) div ;
if calc(q[l+m])<calc(q[l+*m]) then l:=l+m+
else r:=l+*m-;
end;
exit(max(calc(q[l]),calc(q[r])));
end; begin
readln(n,d);
for i:= to n do
begin
readln(h,x);
s[i]:=s[i-]+h;
a[i].x:=int64(i)*d; a[i].y:=s[i-];
now.x:=x+a[i].x; now.y:=s[i];
while (t>) and (getk(q[t-],q[t])>getk(q[t],i)) do dec(t);
inc(t);
q[t]:=i;
ans:=ans+ask;
end;
writeln(ans::);
end.
bzoj3203的更多相关文章
- BZOJ3203 SDOI2013保护出题人(三分)
给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值.这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率. 脑补一条直线不断减小斜率 ...
- bzoj3203【sdoi2013】保护出题人
题目描述 输入格式 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai ...
- 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包
[BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...
- 【BZOJ3203】保护出题人(动态规划,斜率优化)
[BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...
- [BZOJ3203][SDOI2013]保护出题人(凸包+三分)
https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...
- [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)
[BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...
- [bzoj3203][Sdoi2013]保护出题人
人生第一道三分?... 把进攻序列里的前i只僵尸看成一个点,横坐标是第i只僵尸到达的时间,纵坐标是这i只僵尸的血量总和..就是说植物必须在这段时间内输出这些伤害..那么单位时间的输出伤害就是斜率了. ...
- 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分
题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...
- BZOJ3203 保护出题人(defend)
保护出题人(defend) 题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离. 接下来n行每行两个空格隔开的正整数,第i + 1行为 a i和 x i,分别表示相比上一 ...
随机推荐
- [译]Java Thread Sleep示例
Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
- 50个C++源码学习网站
C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 .这份清单提供了源代码的链接以及它们的小说明.我已尽力包括最佳的C/C++源代码的网站.这不是一个完整的 ...
- ubuntu安装oracle java
通常UBUNTU源中带有openjava,但在使用eclipse与android studio时经常会有莫名奇妙的问题,所以个人觉得还是用oracle java,省点心. 安装步骤如下: sudo a ...
- EXTJS 4.2 添加滚动条
bodyStyle: 'overflow-x:hidden; overflow-y:scroll',//显示滚动 文章来源:http://www.cnblogs.com/exmyth/archive/ ...
- mybatis的parameterType使用map实现真正的sql随意写
在dao层给map赋值 纠正一下应该把dd作为传入而不是sbiId; sqlMap中的parameterType="java.util.Map", 就 OK package com ...
- 如何安装Favicon
如何安装Favicon favicon.ico图像放在根目录下(也可以是其他目录)在页面源文件的<head></head>标签之间插入 <link rel="s ...
- js实现网页图片延时加载的原理和代码 提高网站打开速度
有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...
- bzoj 1222: [HNOI2001]产品加工 dp
1222: [HNOI2001]产品加工 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 381 Solved: 218[Submit][Status ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
- [转载]MongoDB设置访问权限、设置用户
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...