题面

​出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了。

参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家。而你作为SDOI2013的参赛者,你需要保护出题人铭铭。

僵尸从唯一一条笔直道路接近,你们需要在铭铭的房门前放置植物攻击僵尸,避免僵尸碰到房子。第一关,一只血量为a1 点的僵尸从距离房子x1 米处匀速接近,你们放置了攻击力为y1 点/秒的植物进行防御;第二关,在上一关基础上,僵尸队列排头增加一只血量为a2点的僵尸,与后一只僵尸距离d 米,从距离房子x2 米处匀速接近,你们重新放置攻击力为y2 点/秒的植物;……;第n 关,僵尸队列共有n 只僵尸,相邻两只僵尸距离d 米,排头

僵尸血量为an 点,排第二的僵尸血量a_n −1 ,以此类推,排头僵尸从距离房子xn 米处匀速接近,其余僵尸跟随排头同时接近,你们重新放置攻击力为yn 点/秒的植物。

每只僵尸直线移动速度均为1 米/秒,由于植物射击速度远大于僵尸移动速度,可忽略植物子弹在空中的时间。所有僵尸同时出现并接近,因此当一只僵尸死亡后,下一只僵尸立刻开始受到植物子弹的伤害。

游戏得分取决于你们放置的植物攻击力的总和Σyi (1<=i<=n),和越小分数越高,为了追求分数上界,你们每关都要放置攻击力尽量小的植物。

作为SDOI2013 的参赛选手,你们能保护出题人么?

对于100%的数据, 1≤n≤105,1≤d≤1012 ,1≤x≤10^12 ,1≤a≤10^12 。

抽象题意

设\(f_i=\sum_{j=1}^ia_j\)

显然$$

ans_i=max_{j=1}^i\frac{f_i-f_{j-1}}{x_i+di-dj}

\[于是就有个$O(n^2)$的做法了;
然后是可以过50%。
#**100**
我们把$\frac{f_i-f_{j-1}}{x_i+d*i-d*j}$看做是,点$(x_i+d*i,f_i)$与$(d*j,f_{j-1})$的斜率;
那么我们就考虑维护这些斜率的最大值。
由于$x_i+d*i>d*j,f_i>f_{j-1}$,所以我们可以给$(d*j,f_{j-1})$维护一个下凸壳,然后三分找峰值即可。
#**Code**

```
#include<bits/stdc++.h>
#define ll long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="ex3299.in";
const char* fout="ex3299.out";
const int inf=0x7fffffff;
const int maxn=100006;
int n,b[maxn],hd,tl;
db m;
db a[maxn],f[maxn],x[maxn],ans;
db count(int a,int b){return (f[a]-f[b-1])/(x[a]+m*a-m*b);}
db xie(int a,int b){return (f[b-1]-f[a-1])/(m*(b-a));}
int main(){
scanf("%d%lf",&n,&m);
fo(i,1,n){
scanf("%lf%lf",&a[i],&x[i]);
f[i]=f[i-1]+a[i];
}
hd=1;
tl=1;
fo(i,1,n){
while (hd<tl && xie(b[tl],i)<xie(b[tl-1],i)) tl--;
b[++tl]=i;
int l=hd,r=tl;
db tmp=0;
while (l<r-2){
int mid=(l+r)/2,mmid=(mid+r+1)/2;
if (count(i,b[mid])<count(i,b[mmid])) l=mid;
else r=mmid;
}
for(;l<=r;l++) tmp=max(tmp,count(i,b[l]));
ans+=tmp;
}
printf("%.0lf",ans);
return 0;
}
```\]

【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ】3203: [Sdoi2013]保护出题人(几何+三分+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3203 wa无数次QAQ,犯sb错....一是数组没有引用...二是输出转成了int(越界了sad). ...

  5. [SDOI2013]保护出题人

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

  6. BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)

    惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...

  7. BZOJ3203 SDOI2013保护出题人(三分)

    给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值.这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率. 脑补一条直线不断减小斜率 ...

  8. bzoj 3203: [Sdoi2013]保护出题人 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3203 题解 首先我们考虑对一大波僵尸来袭的情况进行分析 假设来袭的僵尸是\(\{ a_1 ...

  9. 【文文殿下】 [SDOI2013]保护出题人 题解

    题解 我们把伤害-时间图像画出来.然后维护一下僵尸血量的前缀和.最好情况肯定是有一个僵尸恰好死在戴夫家门口.我们把原点到其他n个点的斜率最大的一个累积到答案. 发现每添加一个点,其他所有点的坐标都变了 ...

随机推荐

  1. JS倒计时两种种实现方式 很不错

    最近做浏览器界面倒计时,用js就实现,两种方式: 一:设置时长,进行倒计时.比如考试时间等等 代码如下: <html> <head> <meta charset=&quo ...

  2. java后台对上传的图片进行压缩

    java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API提供现 ...

  3. 2019-6-14-WPF-shows-that-some-windows-in-multithreading-will-be-locked-in-the-PenThreadWorker-constr...

    title author date CreateTime categories WPF shows that some windows in multithreading will be locked ...

  4. 【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...

  5. leyou_02_nginx使用域名访问本地项目

    1.nginx的搭建依赖环境 1.1 准备jdk环境 当前最新版本下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index. ...

  6. JDK中有关23个经典设计模式的示例

    Creational patterns Abstract factory (recognizeable by creational methods returning an abstract/inte ...

  7. 在三维场景中加载shp(skyline)

    在场景中添加shp图层有两个方法: (1)直接调用Command命令,SGWorld.Command.Execute(1013,5);这样的话,和在场景中的工程树中右键添加特征图层的过程是一样的.有个 ...

  8. RxJS 入门指引和初步应用

    作者:徐飞链接:https://zhuanlan.zhihu.com/p/25383159来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. RxJS是一个强大的React ...

  9. 修改maven本地库路径

    1.打开maven的安装路径:${M2_HOME}/conf/setings.xml文件 2.找到<localRepository>项,将它的值修改就可以了,我修改的是:${M2_HOME ...

  10. 利用TensorFlow识别手写的数字---基于两层卷积网络

    1 为什么使用卷积神经网络 Softmax回归是一个比较简单的模型,预测的准确率在91%左右,而使用卷积神经网络将预测的准确率提高到99%. 2 卷积网络的流程 3 代码展示 # -*- coding ...