二次联通门 : BZOJ 4570: [Scoi2016]妖怪

二次联通门 : luogu P3291 [SCOI2016]妖怪

LibreOJ : LibreOJ  #2015. 「SCOI2016」妖怪

/*
BZOJ 4570: [Scoi2016]妖怪 凸包 我果然还是naive
看见这题就想二分
结果惨挂 做了凸包后就想三分
又挂了。。 完美落入了每个坑。。果然还是自己太菜 对于每个妖怪,其在(a,b)时的最大战力为过当前点斜率为(-b/a)的直线的截距之和
最大的战力就是最外面的那条直线 对n个点做一个上凸包
最大值一定在凸包的右上部分(自行脑补) 那么这些点的斜率都有着一个范围ki-1<ki<ki+1 那么战力就变为了一个双钩函数
讨论求最值即可
*/
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath> void read (long long &now)
{
register char word = getchar ();
int temp = ;
for (now = ; !isdigit (word); word = getchar ())
if (word == '-')
temp = ;
for (; isdigit (word); now = now * + word - '', word = getchar ());
if (temp)
now = -now;
} #define INF 1e9 struct Point
{
long long x, y; Point (long long __x, long long __y) : x (__x), y (__y) {}
Point () {} bool operator < (const Point &now) const
{
return this->x == now.x ? this->y < now.y : this->x < now.x;
} Point operator - (const Point &now) const
{
return Point (this->x - now.x, this->y - now.y);
}
}; inline long long Cross (const Point &A, const Point &B)
{
return A.x * B.y - A.y * B.x;
} #define Max 1000250 inline double Calculate (const Point &now, const double &k)
{
return k >= ? INF : (double) now.x + now.y + - k * now.x - now.y / k;
} inline double Get_point_k (const Point &now)
{
return -sqrt ((double) now.y / now.x);
} inline double Get_line_k (const Point &A, const Point &B)
{
return (A.x ^ B.x) ? ((double)(A.y - B.y) / (double) (A.x - B.x)) : INF;
} int Get_convex_Hull (Point *point, int N, Point *Stack)
{
std :: sort (point + , point + N + ); register int top = ;
for (int i = ; i <= N; ++ i)
{
for (; top > && Cross (Stack[top] - Stack[top - ], point[i] - Stack[top - ]) >= ; -- top);
Stack[++ top] = point[i];
}
return top;
} Point yukari[Max], Stack[Max]; int main (int argc, char *argv[])
{
register int i;
int N;
scanf ("%d", &N);
for (i = ; i <= N; ++ i)
read (yukari[i].x), read (yukari[i].y); int M = Get_convex_Hull (yukari, N, Stack); if (M < )
{
printf ("%.4lf", Calculate (Stack[], Get_point_k (Stack[])));
return ;
}
double k, _k, __k, Answer = INF; k = Get_point_k (Stack[]);
__k = Get_line_k (Stack[], Stack[]); if (k >= __k)
Answer = std :: min (Answer, Calculate (Stack[], k)); k = Get_point_k (Stack[M]);
_k = Get_line_k (Stack[M - ], Stack[M]); if (k <= _k)
Answer = std :: min (Answer, Calculate (Stack[M], k));
Answer = std :: min (Answer, Calculate (Stack[M], _k)); for (i = ; i < M; ++ i)
{
_k = Get_line_k (Stack[i - ], Stack[i]);
__k = Get_line_k (Stack[i], Stack[i + ]); k = Get_point_k (Stack[i]); Answer = std :: min (Answer, Calculate (Stack[i], _k));
if (k <= _k && k >= __k)
Answer = std :: min (Answer, Calculate (Stack[i], k));
}
printf ("%.4lf", Answer);
return ;
}

BZOJ 4570: [Scoi2016]妖怪的更多相关文章

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

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

  2. BZOJ4570: [Scoi2016]妖怪

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

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

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

  4. bzoj 4570 妖怪

    bzoj 4570 妖怪 正解应该是 \(O(nlogn)\) 的凸包,但被我的 \(O(100n)\) 的三分水过去了. 记 $x=\frac b a $ ,显然有 \(strength_i=ATK ...

  5. BZOJ 4571: [Scoi2016]美味

    二次联通门 : BZOJ 4571: [Scoi2016]美味 /* BZOJ 4571: [Scoi2016]美味 dalao们都在说这题如果没有加法balabala就可以用可持久化trie解决了 ...

  6. 【BZOJ 4570】【SCOI 2016】妖怪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4570 对于每个妖怪的两个值,看成二位平面上的一个点的横纵坐标(x,y). 因为只关心a/b,所以设经 ...

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

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

  8. BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]

    4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...

  9. bzoj 4571: [Scoi2016]美味 (主席树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec   ...

随机推荐

  1. 15. Scala并发编程模型Akka

    15.1 Akka介绍 1) Akka是Java虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,可以理解成Akka是编写并发程序的框架 2) Akka用Scala语言写成,同时提供了S ...

  2. CH09 开机自动烧录QSPI

    版本信息: 版本 REV2018 时间 05/22/2018       XILINX ZYNQ LINUX篇 基于米联MZ7X系列                       电子版自学资料   常 ...

  3. Oracle和SQL Server 用当前日期减去 '0001-01-01' 得出的天数不一致,相差2天,谁知道原因?

    Oracle和SQL Server 用当前日期减去 '0001-01-01' 得出的天数不一致,相差2天.求大佬科普

  4. Mybatis配置、逆向工程自动生成代码(CRUD案例)

    目的: mybatis简介 搭建mybatis环境 基于SSM逆向工程的使用 Mybatis增删改查案例 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  5. Linux追加磁盘扩展

    一:查看磁盘空间信息: fdisk -l 查看当前的系统的磁盘空间的情况: 二:增加分区: fdisk /dev/sda 键入n,增加一个分区,得到: 键入 p,主分区,并键入3(编号): 默认起始扇 ...

  6. QQ、微信 唯一登陆设计

    唯一登陆设计指一个账号可以在多个不同的客户端进行登陆,例如PC.Android.IOS等.每一个客户端就会生成一个对应的tokan,相当于生成三个token分别对应不同的客户端. 但是同一个客户端同时 ...

  7. 怎样在python中写注释

    python中的注释是以井号: # 开头, 一般会在#后加一个空格. # This is a comment print("Hello, World!") 多行注释的语法是三引号: ...

  8. VBA分别使用MSXML的DOM属性和XPATH进行网页爬虫

    本文要重点介绍的是VBA中的XmlHttp对象(MSXML2.XMLHTTP或MSXML.XMLHTTP),它可以向http服务器发送请求并使用微软XML文档对象模型Microsoft XML Doc ...

  9. element-ui DatePicker 日期选择器 让结束日期大于开始日期

    element-ui  DatePicker 日期选择器 <el-date-picker v-model="addForm.startDate" type="dat ...

  10. unity图片保留周边,中间延伸

    1.先把图片切割,类似下面这样的 2.然后在使用的时候(选择图片类型的时候选择sliced)