[BZOJ4570][SCOI2016]妖怪(凸包)
两种做法,前一种会TLE。
第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b。
设t为b/a,则战斗力即$f(x,y,t)=x+y+tx+\frac{y}{t}$,其中$t\in(0,+\infty)$。
二分答案c,问题转化为求是否存在t满足,对于所有妖怪,都有$f(x,y,t)<=c$。
两边同乘t并移项,得$xt^2+(x+y-c)t+y<=0$,可以通过解二次不等式得出t的范围。所有妖怪的可行t的交集不为空则c可行。
复杂度$O(n\log INF)$
第二种将每个妖怪看成点(x,y),每个环境看成斜率为$-\frac{b}{a}$的直线,则每个妖怪在某环境下的战斗力就是过它的直线x,y轴截距之和,即$x+y-kx-\frac{y}{k}$。
显然可能更新答案的点一定在上凸包上。建立上凸包,某斜率下的妖怪战斗力最大值就是该直线切凸包时的横纵截距和。
根据对勾函数性质可知,$-kx-\frac{y}{k}$的最大值在$k_0=-\sqrt{\frac{y}{x}}$时取到。
对于凸包上的每个点,若这个点的$k_0$与凸包的切点就是这个点,则用它更新答案,否则,由于对勾函数在极值点两侧都是单调的,所以对每个点都只需要考虑它与左边的点和右边的点连成的直线即可。
复杂度瓶颈在排序,$O(n\log n)$
#include<cmath>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
double ans=1e30,eps=1e-;
int n,top;
struct P{ double x,y; }p[N],s[N];
bool operator <(const P &a,const P &b){ return (a.x==b.x) ? a.y>b.y : a.x<b.x; } double chk(P &a,P &b,P &c){ return (b.x-a.x)*(c.y-b.y)-(c.x-b.x)*(b.y-a.y); }
double sl(P &a,P &b){ return (b.y-a.y)/(b.x-a.x); }
double cal(P &a,double k){ return (fabs(k)<eps) ? 1e30 : a.x+a.y-a.x*k-a.y/k; } int main(){
freopen("bzoj4570.in","r",stdin);
freopen("bzoj4570.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+,p+n+);
rep(i,,n){
if (fabs(s[top].x-p[i].x)<eps) continue;
while (top> && chk(s[top-],s[top],p[i])>) top--;
s[++top]=p[i];
}
rep(i,,top){
double k=-sqrt(s[i].y/s[i].x);
if ((i== || k<=sl(s[i-],s[i])) && (i==top || k>=sl(s[i],s[i+]))) ans=min(ans,cal(s[i],k));
if (i>) ans=min(ans,cal(s[i],sl(s[i-],s[i])));
}
printf("%.4lf\n",ans);
return ;
}
[BZOJ4570][SCOI2016]妖怪(凸包)的更多相关文章
- [Bzoj4570][Scoi2016]妖怪(右上凸包)
4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1110 Solved: 336[Submit][Status][ ...
- BZOJ4570: [Scoi2016]妖怪
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
- 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)
传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...
- BZOJ4570 SCOI2016妖怪(三分)
strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...
- bzoj 4570: [Scoi2016]妖怪 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...
- BZOJ 4570: [Scoi2016]妖怪
二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ #2015. 「SCOI2016 ...
- 【bzoj4570 scoi2016】妖怪
题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...
- 【BZOJ4570】 [Scoi2016]妖怪
Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...
- BZOJ4570:[SCOI2016]妖怪——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...
随机推荐
- bootstrap-table 应用
更多内容推荐微信公众号,欢迎关注: 前端代码:js初始化表格,使用服务器端分页:<!DOCTYPE html> <html> <head> <meta cha ...
- 一个简单的java jdbc案例
有些时候,配置一个spring+mybatis框架,然后写xml,dao ,service显得特别繁琐. 如果我们只是想查一下数据库,不考虑连接复用也不考虑动态sql,可以用原生的jdbc来实现,方便 ...
- go 函数的作用域及可见性
1.全局变量,在程序整个生命周期有效 比如: test.go 中 我们定义 了 a 作为全局变量,那么在这个程序中任何地方都可以调用a, 这个 2. 局部变量,分为两种:1)函数内定义,2)语句块内定 ...
- Linux USB驱动框架分析(2)【转】
转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011 ...
- [HBase]mem store flusher 流程
- python基础--类的方法
一:类的方法说明 类的方法分为实例方法,析构方法,构造方法,类方法,静态方法,属性方法,等等 类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用 类方法的隐含调用参数是类,而类实例方 ...
- DOS命令基础,包涵DOS库说明书
20种常用的DOS命令小结 作者: 字体:[增加 减小] 类型:转载 DOS命令总共大约有一百个(包括文本编辑.查杀病毒.配置文件.批处理等),我们这里详细介绍二十个常用的DOS命令 先介 ...
- 解决Url带中文参数乱码问题
这里我来介绍下如何配置Tomcat 来解决Url带中文参数乱码问题: 首先打开Tomcat安装目录,以Tomcat7为例,其他版本基本一样: 打开conf文件 打开server.xml 大概在70行左 ...
- java jps命令使用解析
在linux环境下显示一个进程的信息大家可能一直都在使用ps命令,比如用以下命令来显示当前系统执行的java进程: ps -ef | grep java 针对java的进程,jdk1.5以后提供了一个 ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...