[luogu1452]Beauty Contest【凸包+旋转卡壳】
题目大意
求出平面最远点对距离的平方。
分析
此题我wa了好久,第一是凸包写错了,后面又是旋转卡壳写错了。。自闭3s。
题解应该是旋转卡壳,但是有人用随机化乱搞过掉了Orz。
讲讲正解。
我们先求出所有点的凸包,然后每一次更新对踵点,就像一个尺子一样卡着这个凸包的每一条边,然后计算两个点对之间的距离就可以了。
代码(借鉴了一下别人的代码)
#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define db double
#define N 50005
#define Vector2 Point
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1; char ch = 0;
for (; ch < '0' || ch > '9'; ch = getchar())
if (ch == '-') fl = -1;
for (; ch >= '0' && ch <= '9'; ch = getchar())
x = (x << 1) + (x << 3) + (ch ^ 48);
x *= fl;
}
template <typename T> T sqr(T x) { return x * x; }
struct Point {
ll x, y;
}P[N], S[N];
int tot = 0;
ll Dist(Point p1, Point p2) {
return sqr(p1.x - p2.x) + sqr(p1.y - p2.y);
}
Vector2 operator -(Vector2 v1, Vector2 v2) {
return (Vector2){v1.x - v2.x, v1.y - v2.y};
}
ll Cross(Vector2 v1, Vector2 v2) {
return v1.x * v2.y - v1.y * v2.x;
}
bool cmp(Point p1, Point p2) {
if (Cross(p1 - P[1], p2 - P[1]) < 0) return 0;
if (Cross(p1 - P[1], p2 - P[1]) > 0) return 1;
return Dist(P[1], p1) < Dist(P[1], p2);
}
bool check(Point p1, Point p2, Point p3, Point p4) {
return Cross(p2 - p1, p4 - p3) <= 0;
}
void Get_Hull(Point *P, int n) {
sort(P + 2, P + 1 + n, cmp);
tot = 0;
S[++ tot] = P[1];
for (int i = 2; i <= n; i ++) {
while (tot > 1 && check(S[tot - 1], S[tot], S[tot], P[i])) -- tot;
S[++ tot] = P[i];
}
S[tot + 1] = S[1];
}
int n;
ll Rotate_Get_ans() {
if (tot == 1) return 0;
if (tot == 2) return Dist(S[1], S[2]);
ll j = 2, ans = 0;
for (int i = 1; i <= tot; i ++) {
while (Cross(S[i + 1] - S[i], S[j] - S[i + 1]) <= Cross(S[i + 1] - S[i], S[j + 1] - S[i + 1])) j = j == tot ? 1 : j + 1;
ans = max(ans, max(Dist(S[i], S[j]), Dist(S[i + 1], S[j])));
}
return ans;
}
int main() {
read(n);
for (int i = 1; i <= n; i ++) {
scanf("%lld%lld", &P[i].x, &P[i].y);
if (P[i].y < P[1].y || (P[i].y == P[1].y && P[i].x < P[1].x)) swap(P[i], P[1]);
}
Get_Hull(P, n);
printf("%lld\n", Rotate_Get_ans());
return 0;
}
[luogu1452]Beauty Contest【凸包+旋转卡壳】的更多相关文章
- POJ 2187 - Beauty Contest - [凸包+旋转卡壳法][凸包的直径]
题目链接:http://poj.org/problem?id=2187 Time Limit: 3000MS Memory Limit: 65536K Description Bessie, Farm ...
- Beauty Contest 凸包+旋转卡壳法
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27507 Accepted: 8493 D ...
- POJ 2187 Beauty Contest [凸包 旋转卡壳]
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36113 Accepted: 11204 ...
- 【POJ 2187】Beauty Contest 凸包+旋转卡壳
xuán zhuǎn qiǎ ké模板题 是这么读吧(≖ ‿ ≖)✧ 算法挺简单:找对踵点即可,顺便更新答案. #include<cstdio> #include<cstring&g ...
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
链接: http://poj.org/problem?id=2187 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- 【POJ】2187 Beauty Contest(旋转卡壳)
http://poj.org/problem?id=2187 显然直径在凸包上(黑书上有证明).(然后这题让我发现我之前好几次凸包的排序都错了QAQ只排序了x轴.....没有排序y轴.. 然后本题数据 ...
- POJ-2187 Beauty Contest,旋转卡壳求解平面最远点对!
凸包(旋转卡壳) 大概理解了凸包A了两道模板题之后在去吃饭的路上想了想什么叫旋转卡壳呢?回来无聊就搜了一下,结果发现其范围真广. 凸包: 凸包就是给定平面图上的一些点集(二维图包),然后求点集组成的 ...
- POJ2187 Beauty Contest(旋转卡壳)
嘟嘟嘟 旋转卡壳模板题. 首先求出凸包. 然后\(O(n ^ 2)\)的算法很好想,但那就不叫旋转卡壳了. 考虑优化:直观的想是在枚举点的时候,对于第二层循环用二分或者三分优化,但实际上两点距离是不满 ...
- POJ2187 Beauty Contest (旋转卡壳算法 求直径)
POJ2187 旋转卡壳算法如图 证明:对于直径AB 必然有某一时刻 A和B同时被卡住 所以旋转卡壳卡住的点集中必然存在直径 而卡壳过程显然是O(n)的 故可在O(n)时间内求出直径 凸包具有良好的性 ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
随机推荐
- 初用Ajax
早就有学习Ajax的想法了,但每次拿起一本Ajax的书,翻了不到百页就学不下去了,里面讲的东西实在太多了,前面讲javaScript的内容看了好 几遍都记不住,也就没心思去看后面的内容:看Ajax案例 ...
- Servlet 使用ServletContext共享数据,读取web.xml配置
ServletContext对象 session和cookie,对于每一个请求用户来说,都是不同的,因为要保证隐私安全. 而有一些数据,可以让所有用户共享,此时就可以用ServletContext对象 ...
- MySQL 5.7 Reference Manual :: 4.5.4 mysqldump & mysql — Database Backup & Restore Program
MySQL :: MySQL 5.7 Reference Manual :: 4.5.4 mysqldump — A Database Backup Programhttps://dev.mysql. ...
- Linux查看和注销用户(User)
Linux如何注销其他用户?_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2012-07/64939.htm linux注销指定 ...
- 手机移动端input date placehoder不显示
要解决这个问题,我们可以伪造一个placehoder,通过css跟js来解决这个问题. 为什么要用js的原因是因为当你选择了时间之后,placehoder的文字没有清除掉,所以我们就需要把这个伪造的p ...
- js-canvas(基本用法)
###1. canvas(画布) <canvas>是HTML 5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形 默认宽高为300px*150px 基本概念和方法入门推荐 ...
- zTree树形菜单使用实例
在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class=”ztree” 第二步:开启简单数据格式支持 第三步:编写树 ...
- K3CLOUD数据权限授权
1.定义角色,把用户放入角色内 2.设置数据规则 3.设置业务对象功能授权
- 18个Python高效编程技巧,Mark!
初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...
- django学习自修第一天【简介】
1. MVC框架 MVC框架的核心思想是解耦,降低各功能之间的耦合性,方便重构代码 (1)低耦合,高内聚 (2)高可扩展性 (3)向后兼容 2. MVT框架 V(视图):核心处理,接受请求,调用模型获 ...