二次联通门 : 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. PB笔记之数据窗口添加虚拟列的方法

    1.选择计算域控件: 2.输入公式 3.添加一个输入框作为列名,注意Name必须改为后缀为_t(PB固定识别_t)才可以绑定输入框和计算域作为虚拟列,虚拟列在最后一列时,有可能不能改变宽度,需往前挪才 ...

  2. vue防止闪屏小技巧:[v-cloak]

    css 内添加此属性[v-cloak] { display: none; } html中引入即可 <div v-cloak> {{ message }} </div> 如果觉得 ...

  3. Web Services使用SOAP Header

    在Web Services方法进行通信使用SOAP遵循标准的SOAP格式,该格式的一部分是在XML文档中编码的数据.XML文档包含一个Envelope根元素(由必需的Body元素和可选的Header元 ...

  4. CTR预估-GBDT与LR实现

    1.来源 本质上 GBDT+LR 是一种具有 stacking 思想的二分类器模型,所以可以用来解决二分类问题.这个方法出自于 Facebook 2014 年的论文 Practical Lessons ...

  5. MySQL性能测试调优

    MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount optio ...

  6. React/虚拟DOM

    在说虚拟DOM之前,先来一个引子,从输入url到展现出整个页面都有哪些过程? 1.输入网址 2.DNS解析 3.建立tcp连接 4.客户端发送HTPP请求 5.服务器处理请求 6.服务器响应请求 7. ...

  7. Linux开机自动启动服务

    当我们的Linux,关机后,或者重启后,有些服务需要人工启动才能有.为了解决这个问题,我找了一个办法,用一个脚本,开机启动想启动的服务. 方法一:(强烈推荐) 1.写一个脚本auto.sh vim  ...

  8. JMeter测试clickhouse

    使用JMeter对clickhouse连接测试 1.测试计划 jmeter通过JDBC连接数据库需要先引入对应的驱动包,驱动包的版本要与服务器数据库版本一致,我用的驱动版本是:clickhouse-j ...

  9. git相关的一篇不错的文章

    原文地址:http://josh-persistence.iteye.com/blog/2215214 点击进入

  10. RMAN恢复数据文件

    实验之前先备份数据库 RMAN>backup database; 在操作系统中删除数据文件 5 SQL> startup ORACLE 例程已经启动. Total System Globa ...