保护出题人(defend)

题目描述

输入

第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离。

接下来n行每行两个空格隔开的正整数,第i + 1行为 a i和 x i,分别表示相比上一关

在僵尸队列排头增加血量为 a i点的僵尸,排头僵尸从距离房子 x i米处开始接近。

输出

一个数,n关植物攻击力的最小总和 ,保留到整数。

样例输入

5 2
3 3
1 1
10 8
4 8
2 3

样例输出

7

提示

来源

sdoi2013R2day2


solution

把ai前缀和起来

得到一个式子:

拆开

很像

显然凸包上的点有用,那就把( aj,-j*d ) 建凸包。

对于点(a[i],i*d+x[i]) 斜率是单峰的。

那么可以三分。

注意整数三分

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000005
#define ll long long
using namespace std;
ll n,d,top;
double ans;
struct node{
ll a,x;
}s[maxn];
struct po{
ll x,y;
}zh[maxn],nex,q;
po xl(po a,po b){
po t;
t.x=a.x-b.x;t.y=a.y-b.y;
return t;
}
ll cj(po a,po b){
return a.x*b.y-a.y*b.x;
}
double getk(po a,po b){
double dx=a.x-b.x,dy=a.y-b.y;
return dy/dx;
}
double ask(po q){
ll l=1,r=top;
while(r-l>=3){//zhengshu sanfen
int lm=l+(r-l)/3,rm=r-(r-l)/3;
double k1=getk(zh[lm],q),k2=getk(zh[rm],q);
if(k1>k2)r=rm;
else l=lm;
}
double fs=0;
for(ll i=l;i<=r;i++)
fs=max(fs,getk(zh[i],q));
return fs;
}
int main()
{
cin>>n>>d;
for(ll i=1;i<=n;i++){
scanf("%lld%lld",&s[i].a,&s[i].x);
s[i].a+=s[i-1].a;
}
for(ll i=1;i<=n;i++){
nex.x=d*i;nex.y=s[i-1].a;
while(top>1&&cj(xl(zh[top],zh[top-1]),xl(nex,zh[top]))<0)top--;
zh[++top]=nex;
q.x=s[i].x+d*i;q.y=s[i].a;
ans+=ask(q);
}
printf("%.0lf\n",ans);
return 0;
}

BZOJ3203 保护出题人(defend)的更多相关文章

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

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

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

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

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

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

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

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

  5. [SDOI2013]保护出题人

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

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

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

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

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

  8. bzoj3203【sdoi2013】保护出题人

    题目描述 输入格式 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai  ...

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

    https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...

随机推荐

  1. 三种序列化方式存取redis的方法

    常见的的序列化反序列方式的效率: protoBuf(PB) > fastjson > jackson > hessian > xstream > java 数据来自于:h ...

  2. axios获取后端数据

    axios向后端请求数据时,一直获取不到数据, 后来改成这样写获取到了数据 不是一个this,有人说用箭头函数就可以了.

  3. 线段树和zkw线段树

    作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...

  4. 深入理解java虚拟机读书笔记1--java内存区域

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  5. 无屏幕和键盘配置树莓派WiFi和SSH

    原文转载:http://shumeipai.nxez.com/2017/09/13/raspberry-pi-network-configuration-before-boot.html 不算是什么新 ...

  6. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿

    3388. [NOIP2013模拟]绿豆蛙的归宿 (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limi ...

  7. DFS:Prime Ring Problem(素数环)

    解体心得: 1.一个回溯法,可以参考八皇后问题. 2.题目要求按照字典序输出,其实在按照回溯法得到的答案是很正常的字典序.不用去特意排序. 3.输出有个坑,就是在输出一串的最后不能有空格,不然要PE, ...

  8. xcode6没有prefix.pch预编译文件解决办法

    注意到Xcode6创建的工程没有prefix.pch. 于是手动创建. 在other下选择pch文件 接着到工程的build setting下设置开启预编译并配置路径(文件的路径.因为我新建在cofi ...

  9. IOS开发学习笔记014-ARC机制

    ARC 1.ARC机制 2.ARC 判断准则 3.注意事项 4.ARC和非ARC混合使用 ARC机制 ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器.因此 AR ...

  10. jmeter正则表达式提取 引用

    jmeter正则表达式token提取 例: 添加正则 配置 token正则表达式:"token":"(.+?)" 模板:$1$ 添加信息头管理器进行配置 需要t ...