两种做法,前一种会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]妖怪(凸包)的更多相关文章

  1. [Bzoj4570][Scoi2016]妖怪(右上凸包)

    4570: [Scoi2016]妖怪 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1110  Solved: 336[Submit][Status][ ...

  2. BZOJ4570: [Scoi2016]妖怪

    题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...

  3. 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)

    传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...

  4. BZOJ4570 SCOI2016妖怪(三分)

    strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...

  5. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

  6. BZOJ 4570: [Scoi2016]妖怪

    二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ  #2015. 「SCOI2016 ...

  7. 【bzoj4570 scoi2016】妖怪

    题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...

  8. 【BZOJ4570】 [Scoi2016]妖怪

    Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...

  9. BZOJ4570:[SCOI2016]妖怪——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...

随机推荐

  1. Windows执行命令与下载文件总结

    1.前言 在渗透或是病毒分析总是会遇到很多千奇百怪的下载文件和执行命令的方法. 2.实现方式 2.1.Powershell win2003.winXP不支持 $client = new-object ...

  2. 去除TFS版本控制

    对于曾经做过TFS版本控制的项目,在版本控制服务不可用的时候,依然会在每次打开项目的时候都提示:当前项目是版本控制的项目,但是当前版本控制不可用,balabala的信息,如果是需要进行版本控制的项目在 ...

  3. XP远程连接Win10,提示【远程计算机需要网络级别身份验证,而您的计算机不支持该验证】

    最近电脑安装了Win10系统,在办公室可以通过其他电脑远程,但是回去后使用自己的电脑(XP系统)进行远程提示失败, 提示[远程计算机需要网络级别身份验证,而您的计算机不支持该验证],然后上网查找资料, ...

  4. Python 模块进阶

    import导入模块 1. import 搜索路径 import sys sys.path 例子: In [1]: import sys In [2]: sys.path Out[2]: ['', ' ...

  5. Python模块制作

    在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字. 定义自己的模块 比如有这样一个文件test.py,在test.py中定义了函数add def add(a,b): ...

  6. Linux_僵尸进程、挂载、block块、inode号

    僵尸进程: 基本概念: 进程分为父进程和子进程 父进程一死 子进程都会死 杀死主进程的时候  子进程也会被杀死 僵尸进程:主进程被杀死了  但是子进程还活着    子进程不会占用cpu但还是会占着内存 ...

  7. CSS3实现文字折纸效果

    CSS3实现文字折纸效果 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title></tit ...

  8. DOS命令大全(二)

    一般来说dos命令都是在dos程序中进行的,如果电脑中安装有dos程序可以从开机选项中选择进入,在windows 系统中我们还可以从开始运行中输入cmd命令进入操作系统中的dos命令,如下图: 严格的 ...

  9. SSIS 学习之旅 数据同步

    这一章 别人也有写过但是我觉得还是写写比较好.数据同步其实就是想仿照 数据库的发布订阅功能 第一章:SSIS 学习之旅 第一个SSIS 示例(一)(上) 第二章:SSIS 学习之旅 第一个SSIS 示 ...

  10. day5作业购物商城+ATM

    模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还 ...