博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3203: [Sdoi2013]保护出题人
阅读量:5125 次
发布时间:2019-06-13

本文共 1317 字,大约阅读时间需要 4 分钟。

我三分这么好吗居然1A啦???提交的时候只是想着先WA一次的。。。。

这题真的很妙啊

首先第一步,就是把僵尸的生命值取一个前缀和,这样造成伤害的时候,可以视为同时对所有僵尸造成伤害。

那么就可以得到一个柿子:

对于第i次进攻,k=max( (sum[i]-sum[j-1]) / x[i]+(i-j)*d ) 其中j表示第j只僵尸。

这样时间的复杂度是O(n^2)的,妥妥的过不去

然后设y1=sum[i],y2=sum[j-1] x1=x[i]+i*d,x2=j*d

柿子就变成了k=(y1-y2)/(x1-x2)这不就是斜率吗

令P(x1,y1),Q(x2,y2)可以发现Q一直是不变的,变的只是P,值得注意的是P的x坐标没有单调性

那么对于Q每次加入用单调栈维护一个下凸包,三分答案出解即可

 

#include
#include
#include
#include
#include
#include
using namespace std;double sum[110000],w[110000];struct node{ double x,y;}sta[110000];int top;double slope(node n1,node n2){ return (n1.y-n2.y)/(n1.x-n2.x);}int main(){ int n;double d; scanf("%d%lf",&n,&d); double ans=0; sum[0]=0;top=0; for(int i=1;i<=n;i++) { scanf("%lf%lf",&sum[i],&w[i]);sum[i]+=sum[i-1]; node Q; Q.x=double(i)*d,Q.y=sum[i-1]; while(top!=0&&slope(sta[top-1],sta[top])>=slope(sta[top],Q))top--; sta[++top]=Q; node P; P.x=w[i]+double(i)*d,P.y=sum[i]; int l=1,r=top; while(r-l>3) { int mid=(l+r)/2; int mmid=(mid+r)/2; if(slope(P,sta[mid])>slope(P,sta[mmid])) { r=mmid-1; } else l=mid+1; } int ip=l; for(int j=l+1;j<=r;j++) if(slope(P,sta[j])>slope(P,sta[ip]))ip=j; ans+=slope(P,sta[ip]); } printf("%.0lf\n",ans); return 0; }

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8909010.html

你可能感兴趣的文章
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>