BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)
题目大意:太长略
每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$
即从头开始每一段僵尸都需要在规定距离内被消灭
展开式子,可得$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+di-dj}}$
是不是很像斜率的式子= = ----$(y2-y1)/(x2-x2)$
维护一个下凸包,这次不是用直线去切凸包,而是把凸包上每个点都向一个定点去连直线,求最大的斜率
会发现,凸包上连出来的直线的斜率是一个凸函数,再利用三分法进行查找
三分法类似于一个爬坡的过程,每次都缩小两侧山坡范围,最终找到山顶
至于为什么维护下凸包呢,画个图就明白了,如果之前某个点$a$,与点$b(b_{x}<a_{x})$的斜率,大于新加入的点$i$与$b$的斜率,那么如果右侧出现一个点,向他们连直线,显然$i$的斜率大于$a$,可以用三角形的性质去证
因为$x$递增,用单调栈维护下凸包即可
时间$O(nlogn)$
貌似比较斜率必须用$double$,不然爆$long\;long$
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 101000
#define M1 205
#define ll long long
#define dd double
#define uint unsigned int
using namespace std; ll gll()
{
ll ret=;int fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n;
ll D;
ll a[N1],s[N1],sa[N1];
ll x[N1],y[N1];
int stk[N1],tp;
inline dd gslope(int i,int j){
return 1.0*(y[i]-y[j])/(x[i]-x[j]);
} int main()
{
//freopen("t2.in","r",stdin);
scanf("%d%lld",&n,&D);
for(int i=;i<=n;i++)
a[i]=gll(),s[i]=gll(),sa[i]=sa[i-]+a[i];
dd ans=;
for(int i=;i<=n;i++)
{
x[i]=1.0*i*D,y[i]=sa[i-];
while(tp>&&gslope(stk[tp],stk[tp-])>=gslope(i,stk[tp-]))
tp--;
stk[++tp]=i;
int l=,r=tp,mid1,mid2;
x[]=1.0*s[i]+1.0*D*i,y[]=sa[i];
while(r-l>=)
{
mid1=(l+l+r)/,mid2=(l+r+r)/;
if(gslope(,stk[mid1])>gslope(,stk[mid2]))
r=mid2;
else
l=mid1;
}
dd ma=;
for(int j=l;j<=r;j++)
ma=max(ma,gslope(,stk[j]));
ans+=ma;
}
printf("%.0lf\n",ans);
return ;
}
BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)的更多相关文章
- bzoj 3203: [Sdoi2013]保护出题人 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3203 题解 首先我们考虑对一大波僵尸来袭的情况进行分析 假设来袭的僵尸是\(\{ a_1 ...
- [BZOJ3203][SDOI2013]保护出题人(凸包+三分)
https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...
- BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)
惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...
- 【BZOJ】3203: [Sdoi2013]保护出题人(几何+三分+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=3203 wa无数次QAQ,犯sb错....一是数组没有引用...二是输出转成了int(越界了sad). ...
- 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] [SDOI2013]保护出题人(二分+凸包)
[BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
随机推荐
- 洛谷P1055 ISBN号码
题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括 999 位数字. 111 位识别码和 333 位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上 ...
- 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) B】Unnatural Conditions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让a+b的和为100000000...0这样的形式就好了 这样s(a+b)=1<=m就肯定成立了(m>=1) 然后至于s ...
- redis_ 5 集群
[转自 ]https://www.cnblogs.com/hjwublog/p/5681700.html#_label0 Redis集群简介 Redis 集群是3.0之后才引入的,在3.0之前,使用哨 ...
- DOM中元素节点,属性节点,文本节点的理解
节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是: nodeName(节点名称) nodeValue(节点值) nodeType(节点类型) nodeType nodeType 属性可 ...
- robot Framework选择单选框
- 百度url 参数详解全
百度url解析Joe.Smith整理大全 百度url解析Joe.Smith整理大全...1 本文链接:http://blog.csdn.net/qq_26816591/article/details/ ...
- 统制Highcharts中x轴和y轴坐标值的密度
统制Highcharts中x轴和y轴坐标值的密度 www.MyException.Cn 发布于:2012-06-26 10:04:13 浏览:688次 1 控制Highcharts中x轴和y轴坐标值的 ...
- [SharePoint]2013装过WindowsServerAppFabricSetup_x64_6.1导致安装不能继续
还是不要自己手动安装2013支持组件.让他自己慢慢下吧. 浪费一个星期的时间. 特此纪念! 令解http://www.cnblogs.com/jianyus/p/3287625.html
- Android 自己定义View学习(2)
上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...
- Java向上转型和向下转型(附具体样例)
Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...