正题

题目链接:https://www.luogu.com.cn/problem/P3291


题目大意

给出 nnn 个数字对 (atk,dnf)(atk,dnf)(atk,dnf),求一个(a,b)(a,b)(a,b)。

对于每个数字对可以选择任意一个实数kkk让其变为(atk+k×a,dnf−k×a)(atk+k\times a,dnf-k\times a)(atk+k×a,dnf−k×a),但是操作完之后两个数字都非负。记atk/dnf(a,b)atk/dnf(a,b)atk/dnf(a,b)表示在(a,b)(a,b)(a,b)下atk/dnfatk/dnfatk/dnf的最大值。

然后要求最小化max{atki(a,b),dnfi(a,b)}max\{atk_i(a,b),dnf_i(a,b)\}max{atki​(a,b),dnfi​(a,b)}。

1≤n≤106,1≤atk,dnf≤1081\leq n\leq 10^6,1\leq atk,dnf\leq 10^81≤n≤106,1≤atk,dnf≤108


解题思路

首先视(atk,dnf)(atk,dnf)(atk,dnf)为一个点的话,那么对于任意一个(a,b)(a,b)(a,b)答案肯定是在上凸壳上的。

然后考虑实际上我们并不需要用到(a,b)(a,b)(a,b)只需考虑ba\frac{b}{a}ab​的值,定义k=bak=\frac{b}{a}k=ab​

然后就是要求最小化(用aia_iai​代atkiatk_iatki​,did_idi​代dnfidnf_idnfi​)
ai+bi+aik+bi1ka_i+b_i+a_ik+b_i\frac{1}{k}ai​+bi​+ai​k+bi​k1​
考虑这个点在kkk的哪些区间由它取到最大值,对于一个jjj需要满足
ai+bi+aik+bi1k>aj+bj+ajk+bj1ka_i+b_i+a_ik+b_i\frac{1}{k}>a_j+b_j+a_jk+b_j\frac{1}{k}ai​+bi​+ai​k+bi​k1​>aj​+bj​+aj​k+bj​k1​
化一下
(ai−aj)k2+(ai−aj+bi−bj)k+(bi−bj)>0(a_i-a_j)k^2+(a_i-a_j+b_i-b_j)k+(b_i-b_j)>0(ai​−aj​)k2+(ai​−aj​+bi​−bj​)k+(bi​−bj​)>0
然后就是一个二次不等式,并且考虑到jjj只需考虑凸壳上iii左右连接的两个点,解出来我们可以得到kkk的合法范围。

然后上面那个是一个对钩函数,现在只需在这个范围内求这个对钩函数的最小值就好了。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e6+10;
struct node{double x,y;
}p[N],s[N];
int n,top;double ans;
bool calc(double a,double b,double c,double &l,double &r){double d=b*b-4.0*a*c;if(d<0)return 0;d=sqrt(d);double x0=(-b-d)/(2*a),x1=(-b+d)/(2*a);if(x0>x1)swap(x0,x1);l=x0;r=x1;return 1;
}
bool cmp(node x,node y)
{return (x.x==y.x)?(x.y>y.y):(x.x<y.x);}
double solpe(node x,node y)
{return (y.y-x.y)/(y.x-x.x);}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);sort(p+1,p+1+n,cmp);for(int i=1;i<=n;i++){while(top>1&&solpe(s[top-1],s[top])<=solpe(s[top-1],p[i]))top--;s[++top]=p[i];}ans=1e18;for(int i=1;i<=top;i++){double z=sqrt(s[i].y/s[i].x);double l=0,r=1e18,L=1,R=1;bool flag=1;if(i>1)calc(s[i].x-s[i-1].x,s[i].x-s[i-1].x+s[i].y-s[i-1].y,s[i].y-s[i-1].y,L,R);if(i<top)flag&=calc(s[i].x-s[i+1].x,s[i].x-s[i+1].x+s[i].y-s[i+1].y,s[i].y-s[i+1].y,l,r);if(!flag)continue;if(L<l)l=max(R,l);if(R>r)r=min(r,L);if(l>r||r<=0)continue;z=max(z,l);z=min(z,r);if(z>L&&z<R){if(L>=l)ans=min(ans,s[i].x+s[i].y+s[i].x*L+s[i].y/L);if(R<=r)ans=min(ans,s[i].x+s[i].y+s[i].x*R+s[i].y/R);}else ans=min(ans,s[i].x+s[i].y+s[i].x*z+s[i].y/z);}printf("%.4lf\n",ans);return 0;
}

P3291-[SCOI2016]妖怪【凸壳】相关推荐

  1. 【BZOJ4570】 [Scoi2016]妖怪

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

  2. 利用OpenCV的convexHull和convexityDefects做凸包(凸壳)检测及凸包(凸壳)的缺陷检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 要理解凸包(凸壳)检测,首无要知道什么是凸包(凸 ...

  3. CF536C-Tavas and Pashmaks【凸壳】

    正题 题目链接:https://codeforces.com/contest/536/problem/C 题目大意 nnn个人,第iii个人的游泳速度sis_isi​,跑步速度是rir_iri​.如果 ...

  4. P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P5540 题目大意 给出nnn个点mmm条边边权是一个二元组(ai,bi)(a_i,b_i)(ai​,bi​),求出 ...

  5. YbtOJ#853-平面标记【整体二分,凸壳】

    正题 题目链接:http://www.ybtoj.com.cn/contest/119/problem/3 题目大意 给出nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),mmm次给出(k ...

  6. YbtOJ#482-爬上山顶【凸壳,链表】

    正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/2 题目大意 nnn个点,xxx坐标递增,第iii个点向第jjj个点连边. 开始一个人在点ss ...

  7. P3309-[SDOI2014]向量集【线段树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 nnn个操作 在序列末尾加入一个向量(x,y)(x,y)(x,y) 询问加入的第l∼rl\sim ...

  8. BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)

    题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...

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

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

最新文章

  1. 用自定义IHttpModule实现URL重写
  2. eosjs 文档(介绍)
  3. android camera入门,android 基础一 Camera1 预览、拍照
  4. cdr文件过大导出pdf打不开_PDF文件过大怎样压缩?这才是压缩PDF最简单的方法
  5. linux compress参数,compress命令_Linux compress 命令用法详解:使用Lempress-Ziv编码压缩数据文件...
  6. 从一次线上故障思考Java问题定位思路,java初级面试笔试题
  7. flex布局实现垂直居中
  8. matlab矩阵运算rank,Matlab矩阵运算
  9. HTML电子邮件格式的制作与发送
  10. 解决:蓝奏云下载链接没法打开问题
  11. C#利用Magick图片压缩
  12. 程序员的而立之年,迷茫之年
  13. Day 10 - Anticipation | RIPS 2017 PHP代码安全审计挑战(RIPSTECH PRESENTS PHP SECURITY CALENDAR)/ Writeup
  14. python小应用之整理手机图片_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
  15. 手游族迎来360手机卫士神助攻 玩家免打扰尽情发育
  16. 【JavaScript】- 打地鼠游戏(定时器嵌套延时器)
  17. 解压文件时文件名出现菱形问号������解决方案
  18. 2020年 - 年终总结
  19. SpringCloud的五大核心组件李俊老师
  20. 吴恩达:回顾2021,这些大事件影响了AI这一年

热门文章

  1. mysql集群从节点无法启动_一次galera cluster集群故障节点无法启动问题排查
  2. oracle 大页配置,【Oracle】Oracle如何开启大页
  3. jdbc mysql user_tab_comments_mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)...
  4. 创建失败_号称人人都可编辑的百科词条,创建之路为何屡屡失败?
  5. php 获取对象所有成员变量,PHP成员变量获取对比
  6. mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)
  7. ecshop goods.php,重命名ecshop的商品页goods.php为shangpin.php
  8. python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
  9. 完美国际真数苹果_如果给你推荐一款很贵,但好用的苹果手机壳,你会买吗?...
  10. python中list的意思_list在python中是什么意思