题目大意

具体自己看吧link

读入n,D,表示n关

大概就是第i关有i只僵尸排成一队来打出题人

最前面那只是编号为\(i\)的僵尸,最后面的一只是编号为\(1\)的僵尸

最前面的僵尸离出题人\(X_i\)的距离,其它每只僵尸离前一只距离为固定值D

僵尸平均每秒1米,植物每秒攻击力\(y\)

植物连续攻击,可以当它激光,打死前一只瞬间就可以开始打后一只

对于每一关,我们要选择一个尽可能小的y,保证出题人不被打死

求y总和最小为多少

分析

我们考虑\(y\)要满足什么条件

首先要打死每只僵尸,极限是在它到出题人跟前时把它打死

这时我们总共攻击了\(dist*y\)的血量,打掉了那只僵尸的前缀和血量

\(y_i=max\{\frac {sum[i]-sum[j-1]} {x[i]+(i-j)*d}\}\)(i可以等于j)

转化为斜率形式

y2=sum[i], y1=sum[j-1]

x2=x[i]+id, x1=jd

将(x1,y1)用凸包维护一个下凸壳

用(x2,y2)在凸包上三分找到一个斜率最大的点

solution

#include <cstdio>
#include <cstdlib>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef long double db;
const int M=100007; inline LL rd(){
LL x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n;
db ans;
LL D,sum[M],bg[M]; struct pt{
db x,y;
pt(db xx=0,db yy=0){
x=xx; y=yy;
}
}stack[M]; int tot; pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
db operator ^(pt x,pt y){return x.x*y.x-x.y*y.y;}
db operator *(pt x,pt y){return x.x*y.y-y.x*x.y;} db side(pt x,pt y,pt z){return (y-x)*(z-x);}
db slop(pt x,pt y){pt tp=y-x;return tp.y/tp.x;} void ins(pt x){
while(tot>1&&side(stack[tot-1],stack[tot],x)<0) tot--;
stack[++tot]=x;
} db get(pt x){
int l=1,r=tot,m1,m2,le;
db d1,d2;
while(l+1<r){
le=(r-l+1)/3;
m1=l+le-1;
m2=m1+le;
d1=slop(stack[m1],x);
d2=slop(stack[m2],x);
if(d1<d2) l=m1+1;
else r=m2-1;
}
return max(slop(stack[l],x),slop(stack[r],x));
} int main(){
int i;
n=rd(),D=rd();
for(i=1;i<=n;i++){
sum[i]=sum[i-1]+rd();
bg[i]=rd();
}
pt nw;
for(i=1;i<=n;i++){
nw=pt(i*D,sum[i-1]);
ins(nw);
nw=pt(bg[i]+i*D,sum[i]);
ans+=get(nw);
}
printf("%.0Lf\n",ans);
return 0;
}

bzoj 3203 凸包+三分的更多相关文章

  1. bzoj 4311 向量 时间线建线段树+凸包+三分

    题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...

  2. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  3. BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)

    洛谷传送门 题目大意:太长略 每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即从头开始每一段僵尸都需要在规定距 ...

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

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

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

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

  6. bzoj 2961 共点圆 cdq+凸包+三分

    题目大意 两种操作 1)插入一个过原点的圆 2)询问一个点是否在所有的圆中 分析 在圆中则在半径范围内 设圆心 \(x,y\) 查询点\(x_0,y_0\) 则\(\sqrt{(x-x_0)^2+(y ...

  7. BZOJ3533 [Sdoi2014]向量集 【线段树 + 凸包 + 三分】

    题目链接 BZOJ3533 题解 我们设询问的向量为\((x_0,y_0)\),参与乘积的向量为\((x,y)\) 则有 \[ \begin{aligned} ans &= x_0x + y_ ...

  8. BZOJ 1857 传送带 (三分套三分)

    在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从 ...

  9. BZOJ 3203 sdoi 2013 保护出题人

    由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...

随机推荐

  1. Js笔记 14

      <script> // <!-- 课 对象   // //对象的创建方法 // 1.var obj = {} plainobject 对象字面量 对象直接量 // 2.构造函数 ...

  2. lua 分割字符串

    -- 参数:待分割的字符串,分割字符 -- 返回:子串表.(含有空串) function split(str, split_char) local sub_str_tab = {} while tru ...

  3. pandas中数据聚合【重点】

    数据聚合 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值. 数据分类处理: 分组:先把数据分为几组 用函数处理:为不同组的数据应用不同的函数以转换数据 合并:把不同组得到的结果合 ...

  4. idea 启动不了

    idea 更新了新版本.  破解步骤安排完了之后 ,  发现怎么也启动不了.  没有任何提示. 于是为了查看错误信息去idea的安装目录bin下用idea.bat脚本启动发现了如下错误: 在idea6 ...

  5. Linux安装配置***客户端

    1.创建root用户 sudo passwd root su root 2.安装shadowsocks sudo apt-get install python-pip sudo pip install ...

  6. Kattis - doubleclique (图论)

    From : North American Invitational Programming Contest 2018 给你一个图,以及它的补图.如果部分点在原图中是团,并且其他的所有点在补图中也是团 ...

  7. 【LeetCode】Linked List Cycle II(环形链表 II)

    这是LeetCode里的第142道题. 题目要求: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? ...

  8. c++,友元类和友元函数

    都是声明时友元的东西可以访问自己类的私有和保护成员 类的友元 友元是C++提供的一种破坏数据封装和数据隐藏的机制. 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息 ...

  9. 12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)

    12864点阵液晶显示模块(LCM)就是由 128*64个液晶显示点组成的一个128列*64行的阵列.每个显示点对应一位二进制数,1表示亮,0表示灭.存储这些点阵信息的RAM称为显示数据存 储器.要显 ...

  10. P2598 [ZJOI2009]狼和羊的故事(最小割)

    P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么 ...