4570: [Scoi2016]妖怪


Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1110  Solved: 336
[Submit][Status][Discuss]

Description


邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性。邱老师立志成为妖怪大师,于
是他从真新镇出发,踏上未知的旅途,见识不同的风景。环境对妖怪的战斗力有很大影响,在某种环境中,妖怪可
以降低自己k×a点攻击力,提升k×b点防御力或者,提升自己k×a点攻击力,降低k×b点防御力,a,b属于正实数
,k为任意实数,但是atk和dnf必须始终非负。妖怪在环境(a,b)中的战斗力为妖怪在该种环境中能达到的最大攻击
力和最大防御力之和。strength(a,b)=max(atk(a,b))+max(dnf(a,b))环境由a,b两个参数定义,a,b的含义见前
文描述。比如当前环境a=3,b=2,那么攻击力为6,防御力为2的妖怪,能达到的最大攻击力为9,最大防御力为6。
所以该妖怪在a=3,b=2的环境下战斗力为15。因此,在不同的环境,战斗力最强的妖怪可能发生变化。作为一名优
秀的妖怪训练师,邱老师想发掘每一只妖怪的最大潜力,他想知道在最为不利的情况下,他的n只妖怪能够达到的
最强战斗力值,即存在一组正实数(a,b)使得n只妖怪在该环境下最强战斗力最低。
 

Input


第一行一个n,表示有n只妖怪。接下来n行,每行两个整数atk和dnf,表示妖怪的攻击力和防御力。
1≤n≤10^6, 0<atk,dnf≤10^8

Output


输出在最不利情况下最强妖怪的战斗力值,保留4位小数。

Sample Input


  1.  

Sample Output


  1. 8.0000

分析


虽然是看了别人的博客才写起的,但也要写博客加深印象。
设atk为x,dnf为y。那么每个妖怪能看成平面上的一个点(x,y)
设最强战斗力为L
合并一下

发现是L是一条斜率-b/a的直线。

如果已知直线L,在它下最强的妖怪是谁呢?

那么画图来试试,一大堆小点点是一个妖怪,然后右上角是维护的右上凸包

发现粉色直线与右上凸包的切点是在它下的最强妖怪

为什么是右上凸包与它切点最优,因为我们答案是横纵截距之和,我们把直线往下平移发现横纵截距都在减小,肯定不会比切点的战斗力小

已知右上凸包怎么对右上凸包每个点求出一个最优的斜率k使它为切点?

可以得出结论:斜率一定是大于它与上一个点连线的斜率,小于它与下一个点连线的斜率

设右上凸包每一个点与下一个点连线斜率为ki

那么斜率k就在这个范围内,我们要在这个范围内求一个点使答案最小。

当我们已知点(x,y)求L时,x,y变成了常数,又斜率k为-b/a

那么答案可以表示为

发现是个双钩函数,在k = -(x/y)^½时取最小。

因为是双钩函数不满足单调,我就去三分了,然后华丽丽T了。

其实我们可以判断一下双钩函数顶点是否在合法范围内,是的话取最小值

不是的话肯定是关于双钩函数的一边,则具有单调性。

那么此时我就想到二分了。。。然后完美地t了

正解:

合法范围ki-1和ki一定是双钩函数定义域的端点。每个点可以用ki算一次答案,如果顶点在定义域内还可以算一次答案

AC代码:


  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <cmath>
  5. # include <algorithm>
  6. using namespace std;
  7. const int N = 1e6 + ;
  8. const double eps = 1e-;
  9. const double inf = 0x3f3f3f3f;
  10. struct Point{
  11. double x,y;
  12. Point(){}
  13. Point(double a,double b) : x(a),y(b){}
  14. void read(){scanf("%lf %lf",&x,&y);}
  15. double com(){return x + y + * sqrt(x * y);}
  16. bool operator <(const Point & other)const{return x == other.x ? y > other.y : x > other.x;}
  17. }a[N];
  18. int n,ed;double k[N],ans = inf;
  19. Point operator -(Point a,Point b){return Point(a.x - b.x,a.y - b.y);}
  20. double Get(Point a){return a.y / a.x;}
  21. double Cross(Point a,Point b){return a.x * b.y - a.y * b.x;}
  22. int main()
  23. {
  24. scanf("%d",&n);
  25. for(int i = ;i <= n;i++)a[i].read();
  26. sort(a + ,a + n + );int top = ;
  27. for(int i = ;i <= n;i++)
  28. {
  29. while(top > && Cross(a[i] - a[top],a[top] - a[top - ]) >= )top--;
  30. a[++top] = a[i];
  31. }
  32. a[top + ] = Point(,);
  33. for(int i = ;i <= top;i++)
  34. {
  35. k[i] = Get(a[i + ] - a[i]);
  36. ed = i;if(k[i] >= )break;
  37. }
  38. k[ed] = -eps;k[] = -inf;
  39. for(int i = ;i <= ed;i++)
  40. {
  41. double mk = -sqrt(a[i].y / a[i].x),cg = inf,he;
  42. if(mk > k[i - ] && mk < k[i])cg = a[i].com();
  43. he = a[i].x + a[i].y - a[i].x * k[i] - a[i].y / k[i];
  44. cg = cg > he ?
  45. he : cg;ans = ans > cg ? cg : ans;
  46. }
  47. printf("%.4lf\n",ans);
  48. }
 

[Bzoj4570][Scoi2016]妖怪(右上凸包)的更多相关文章

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

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

  2. BZOJ4570: [Scoi2016]妖怪

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

  3. [BZOJ4570][SCOI2016]妖怪(凸包)

    两种做法,前一种会TLE. 第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b. 设t为b/a,则战斗力即$f(x,y,t) ...

  4. BZOJ4570 SCOI2016妖怪(三分)

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

  5. BZOJ 4570: [Scoi2016]妖怪

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

  6. 【bzoj4570 scoi2016】妖怪

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

  7. LOJ#2015. 「SCOI2016」妖怪(凸包)

    传送门 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直线,战斗力就是这条直线在两坐标轴上的截距之和 对于每 ...

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

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

  9. 【BZOJ4570】 [Scoi2016]妖怪

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

随机推荐

  1. Spring中@Value的使用

  2. SEO 第九章

    SEO第九章 本次课目标: 1.  外部优化之平台优化 2.  如何撰写SEO诊断方案 一.外部平台优化——百度系列平台 百度系列的平台都是属于百度自己的产品,排名都是比较高的,所以我们在做外部推广的 ...

  3. 爬虫学习之第一次获取网页内容及BeautifulSoup处理

    from urllib.request import urlopen from urllib.request import HTTPError from bs4 import BeautifulSou ...

  4. js实现返回上一页功能

    大家在做 "返回上一页" 这个功能的时候 都是用history.go(-1);来实现的 但这段代码只是简单的使用浏览器的后退功能 从浏览器缓存中取出页面来显示 但我们绝大部分情况都 ...

  5. JS数组专题1️⃣ ➖ 数组扁平化

    一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...

  6. vector性能调优之resize与reserve

    vector的resize与reserve reserve()函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size) resize() 函数( void resi ...

  7. 天梯赛L1 题解

    L1-001 Hello World (5 分) 这道超级简单的题目没有任何输入. 你只需要在一行中输出著名短句“Hello World!”就可以了. AC代码:(直接输出记性) #include & ...

  8. InnoDB INFORMATION_SCHEMA Lock Tables

    InnoDB INFORMATION_SCHEMA Lock Tables 三张InnoDB INFORMATION_SCHEMA表使您能够监视事务并诊断潜在的锁定问题: INNODB_TRX:提供有 ...

  9. (15) openssl签署和自签署证书的多种实现方式

    1.采用自定义配置文件的实现方法 1.1 自建CA 自建CA的机制:1.生成私钥:2.创建证书请求:3.使用私钥对证书请求签名. 由于测试环境,所以自建的CA只能是根CA. 所使用的配置文件如下: [ ...

  10. 深入Linux内核架构——简介与概述

    一.内核的任务 纯技术层面上,内核是硬件与软件的之间的一个中间层.作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址. 从应用程序视角上看,内核可以被认为是一台增强 ...