二次联通门 : 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. DNS 解析

    DNS即为Domain Name System的缩写形式,就是所谓的域名系统,它是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网. 如果想访问某个网站( ...

  2. Codeforces Round #419 (Div. 1) (ABCD)

    1. 815A Karen and Game 大意: 给定$nm$矩阵, 每次选择一行或一列全部减$1$, 求最少次数使得矩阵全$0$ 贪心, $n>m$时每次取一列, 否则取一行 #inclu ...

  3. 理解javascript中的立即执行函数(function(){})()(转)

    原文:https://www.cnblogs.com/yanzp/p/6371292.html

  4. MySQL 索引机制

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  5. OSS服务和自建服务器存储对比

    1 OSS 1.1 什么是OSS   阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.它是一个分布式的对象存储服务 ...

  6. SringMVC笔记

    SpringMvc主要是三个Servlet:HttpServletBean,FramwworkServlet,DispatcherServlet,它们是依次继承的关系,其处理过程大致功能如下: 1.H ...

  7. [JZOJ5280]膜法师题解--思维+前缀和

    [JZOJ5280]膜法师题解--思维+前缀和 题目链接 暴 力 过 于

  8. Canvas 绘制一个像素风电子时钟

    想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...

  9. apache ftp server 设置

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  10. rabbitmq笔记(一)rabbitmq简介及基础

    一.消息组件 如果从消息组件来讲主要划分位两类: 1.JMS组件:ActiveMQ(慢): 2.AMQP组件(协议):性能是最高的, 而AMQP有两个主要的开源: 1)RabbitMQ:使用最广泛,速 ...