博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1452 Beauty Contest 旋转卡壳
阅读量:5347 次
发布时间:2019-06-15

本文共 2473 字,大约阅读时间需要 8 分钟。

\(\color{#0066ff}{题目描述}\)

贝茜在牛的选美比赛中赢得了冠军”牛世界小姐”。因此,贝西会参观N(2 < = N < = 50000)个农场来传播善意。世界将被表示成一个二维平面,每个农场位于一对整数坐标(x,y),各有一个值范围在-10000…10000。没有两个农场共享相同的一对坐标。

尽管贝西沿直线前往下一个农场,但牧场之间的距离可能很大,所以她需要一个手提箱保证在每一段旅程中她有足够吃的食物。她想确定她可能需要旅行的最大可能距离,她要知道她必须带的手提箱的大小。帮助贝西计算农场的最大距离。

\(\color{#0066ff}{输入格式}\)

第一行:一个整数n

第2~n+1行:xi yi 表示n个农场中第i个的坐标

\(\color{#0066ff}{输出格式}\)

一行:最远距离的平方

\(\color{#0066ff}{输入样例}\)

40 00 11 11 0

\(\color{#0066ff}{输出样例}\)

2

\(\color{#0066ff}{数据范围与提示}\)

none

\(\color{#0066ff}{题解}\)

旋转卡壳的裸题了

先求出凸包

然后枚举凸包上的点,维护单调指针

距离可以通过面积判断(底固定,高最大)

注意,本题有巨坑,居然有一条线的情况,怎么TM求凸包!!!!

#include 
#include
#include
#include
#define _ 0#define LL long longinline LL in() { LL x = 0, f = 1; char ch; while(!isdigit(ch = getchar()))(ch == '-') && (f = -f); while(isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar(); return x * f;}const int maxn = 50505;int n;struct node { int x, y; node(int x = 0, int y = 0) :x(x), y(y) {} friend node operator - (const node &a, const node &b) { return node(a.x - b.x, a.y - b.y); } friend int operator ^ (const node &a, const node &b) { return a.x * b.y - a.y * b.x; } int mo() { return x * x + y * y; } double jj() { return atan2((double)y, (double)x); }}e[maxn];int s[maxn], top;int S(node a, node b, node c) { return (c - a) ^ (c - b);}int cmp(node a,node b){ return ((a.jj() < b.jj()) || (a.jj() == b.jj() && (a - e[0]).mo() < (b - e[0]).mo()));}void tubao() { int min = 0; for(int i = 0; i < n; i++) { e[i].x = in(), e[i].y = in(); if(e[i].y < e[min].y || (e[i].y == e[min].y && e[i].x < e[min].x)) min = i; } std::swap(e[0], e[min]); for(int i = 1; i < n; i++) e[i] = e[i] - e[0]; e[0] = node(0, 0); std::sort(e + 1, e + n, cmp); s[0] = 0, s[1] = 1, s[top = 2] = 2; for(int i = 3; i < n; i++) { while(top >= 1 && ((e[s[top]] - e[s[top - 1]]) ^ (e[i] - e[s[top]])) <= 0) top--; s[++top] = i; }}void rotate() { s[++top] = s[0]; int ans = 0; int r = 1; for(int l = 0; l < top; l++) { while(S(e[s[l]], e[s[l + 1]], e[s[r + 1]]) > S(e[s[l]], e[s[l + 1]], e[s[r]])) r = (r + 1) % top; ans = std::max(ans, std::max((e[s[l]] - e[s[r]]).mo(), (e[s[l + 1]] - e[s[r]]).mo())); } printf("%d\n", ans);}signed main() { n = in(); tubao(); rotate(); return 0;}

转载于:https://www.cnblogs.com/olinr/p/10189421.html

你可能感兴趣的文章
百度网盘 | 爱奇艺万能播放器与百度网盘的功能关联体验
查看>>
常用的iOS第三方资源
查看>>
黄金点游戏结队编
查看>>
a标签的target属性
查看>>
不规范的json文档 转化成 java 对象的处理
查看>>
大数据学习总结(7)we should...
查看>>
数据结构与算法之二分查找
查看>>
linux拓展下:批量改扩展名的方法
查看>>
SPI、IIC、IIS、UART、JTAG的应用场合级区别
查看>>
Linux编程学习日之 GNU make-001
查看>>
软工1816 · Alpha冲刺(8/10)
查看>>
lua require
查看>>
MVC从Controller到view进行传值的方法
查看>>
JMS实战——ActiveMQ实现Pub-Sub
查看>>
JavaScript--天猫数量输入框
查看>>
gulp思考
查看>>
js 网页运行原理
查看>>
jquery dom
查看>>
Eigen 由稀疏矩阵生成三元组(稀疏矩阵分块操作经常用到)
查看>>
括号序列
查看>>