由于样例解释很清晰,所以很容易得到以下结论:

1、每一关都是独立的,且僵尸的相对位置不会变

2、每一关的攻击力=Max(sum(i)/dis(i))

其实sum(i)是僵尸攻击力的前缀和,dis(i)是距离

然后因为输入是每次在队头添加,所以我们可以把前缀和转换成后缀和

攻击力=Max( (sum_i-sum_j)/(x_i+i*d-j*d) )

这显然是一个斜率的式子,又因为僵尸的相对位置不变

所以我们可以维护一个下凸壳,之后每次在凸壳上三分最优解即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define eps 1e-8
using namespace std; const int maxn=100010;
int n,top=0,cur;
double d,ans;
double A[maxn],X[maxn];
double sum[maxn];
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
Point st[maxn];
typedef Point Vector;
Vector operator -(const Point &A,const Point &B){return Vector(A.x-B.x,A.y-B.y);}
double Cross(const Point &A,const Point &B){return A.x*B.y-A.y*B.x;} double F(int x){
return (sum[cur]-st[x].y)/(X[cur]+cur*d-st[x].x);
} int main(){
scanf("%d%lf",&n,&d);
for(int i=1;i<=n;++i)scanf("%lf%lf",&A[i],&X[i]),sum[i]=sum[i-1]+A[i];
for(int i=1;i<=n;++i){
Point now=Point(d*i,sum[i-1]);
while(top>=2&&Cross(now-st[top],st[top]-st[top-1])>eps)top--;
st[++top]=now;cur=i;
int L=1,R=top;
while(R-L>=3){
int m1=(L+L+R)/3,m2=(L+R+R)/3;
if(F(m1)>F(m2))R=m2;
else L=m1;
}
double sum=-1e18;
for(int j=L;j<=R;++j)sum=max(sum,F(j));
ans+=sum;
//printf("%.8lf\n",sum);
}printf("%.0lf\n",ans);
return 0;
}

  

BZOJ 3203 sdoi 2013 保护出题人的更多相关文章

  1. 解题:SDOI 2013 保护出题人

    题面 首先是愉快的推式子 $dp[i]=max(dp[i],\frac{sum[i]-sum[j-1]}{x[i]+(i-j)*d})(1<=j<=i<=n)$(考虑有一只僵尸正好走 ...

  2. 【BZOJ3203】保护出题人(动态规划,斜率优化)

    [BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...

  3. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  4. 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包

    [BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...

  5. BZOJ3203 保护出题人(defend)

    保护出题人(defend) 题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离. 接下来n行每行两个空格隔开的正整数,第i + 1行为 a i和 x i,分别表示相比上一 ...

  6. [SDOI2013]保护出题人

    题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...

  7. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  8. [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)

    [BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...

  9. 【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳

    题面 ​出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了. 参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013 ...

随机推荐

  1. 9种jQuery和css3图片动画特效代码演示

    1.自由旋转的jQuery图片 演示和下载地址 2.css3阴影动画效果 演示和下载地址 3.拉窗帘特效图片 演示和下载地址 4.css3文字特效动画 演示和下载地址 5.css3时钟代码 演示和下载 ...

  2. javascript里面技巧整理

    web develop tools secrets: http://jinlong.github.io/blog/2013/08/29/devtoolsecrets/ 1.Date new Date( ...

  3. mongodb的常用操作(三)

    继续mongodb的学习和总结: 11.mongodb的mapreduce功能 mapreduce可以说是mongodb的一个很强大的功能,可以实现复杂的运算和统计,做一个简要的总结: 假设有user ...

  4. linux服务器git pull/push时提示输入账号密码之免除设置

    1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...

  5. Super Object Toolkit (支持排序)

    (* * Super Object Toolkit * * Usage allowed under the restrictions of the Lesser GNU General Public ...

  6. smarty框架块函数

    块函数的形式是这样的:{func} .. {/func}.换句话说,它们被封闭在一个模板区域内,然后对该区域的内容进行操作.默认地,你的函数实现会被Smarty调用两次:一次是在开始标签,另一次是在闭 ...

  7. linux学习之进程,线程和程序

                                                                                      程序.进程和线程的概念 1:程序和进 ...

  8. Session设置不当导致API变成单线程问题的解决

    起因: 最近开发一个项目,有个接口很慢(数据库的问题),然后在执行期间,随手去点了其他功能(调用其他接口),发现不响应了.等那个很慢的接口返回结果了,这个功能才立马返回结果.  这明显是一个问题啊! ...

  9. 微软职位内部推荐-SDE2 (Windows driver)

    微软近期Open的职位: SDE2 (Windows driver) Job title: Software Development Engineer 2 Location: Shanghai, Ch ...

  10. 对frameset、frame、iframe的js操作

    框架编程概述一个HTML页面可以有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面.这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一 ...