poj 2187 Beauty Contest , 旋转卡壳求凸包的直径的平方
2017-04-13 18:38
501 查看
旋转卡壳求凸包的直径的平方
板子题
板子题
#include<cstdio> #include<vector> #include<cmath> #include<algorithm> using namespace std; struct Point { int x, y; Point(int x=0, int y=0):x(x),y(y) { } }; typedef Point Vector; Vector operator - (const Point& A, const Point& B) { return Vector(A.x-B.x, A.y-B.y); } int Cross(const Vector& A, const Vector& B) { return A.x*B.y - A.y*B.x; } int Dot(const Vector& A, const Vector& B) { return A.x*B.x + A.y*B.y; } int Dist2(const Point& A, const Point& B) { return (A.x-B.x)*(A.x-B.x) + (A.y-B.y)*(A.y-B.y); } bool operator < (const Point& p1, const Point& p2) { return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y); } bool operator == (const Point& p1, const Point& p2) { return p1.x == p2.x && p1.y == p2.y; } // 点集凸包 // 假设不希望在凸包的边上有输入点,把两个 <= 改成 < // 注意:输入点集会被改动 vector<Point> ConvexHull(vector<Point>& p) { // 预处理。删除反复点 sort(p.begin(), p.end()); p.erase(unique(p.begin(), p.end()), p.end()); int n = p.size(); int m = 0; vector<Point> ch(n+1); for(int i = 0; i < n; i++) { while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--; ch[m++] = p[i]; } int k = m; for(int i = n-2; i >= 0; i--) { while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--; ch[m++] = p[i]; } if(n > 1) m--; ch.resize(m); return ch; } //返回点集直径的平方 int diameter2(vector<Point> & points) { vector<Point> p = ConvexHull(points); int n = p.size(); if(n==1) return 0; if(n==2) return Dist2(p[0], p[1]); p.push_back(p[0]); int ans = 0; for(int u = 0, v = 1; u < n; ++u) { for(;;) { int diff = Cross(p[u+1]-p[u], p[v+1]-p[v]); if(diff<=0) { ans = max(ans, Dist2(p[u], p[v])); if(diff==0) ans = max(ans, Dist2(p[u], p[v+1])); break; } v = (v+1) % n; } } return ans; } int main() { int n; scanf("%d", &n); vector<Point> P; for(int i=0; i<n; ++i) { int x, y; scanf("%d%d", &x, &y); P.push_back(Point(x, y)); } printf("%d\n", diameter2(P)); return 0; }
相关文章推荐
- poj 2187 Beauty Contest , 旋转卡壳求凸包的直径的平方
- 【凸包直径&平面最远点对&对锺点(旋转卡壳)】poj 2187 Beauty Contest
- 【POJ 2187】Beauty Contest(凸包直径、旋转卡壳)
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
- POJ 2187 Beauty Contest(凸包优化 || 凸包+旋转卡壳)
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
- 【POJ 2187】Beauty Contest 凸包+旋转卡壳
- poj 2187 Beauty Contest(凸包+旋转卡壳)
- poj 2187 Beauty Contest 经典题目:凸包+旋转卡壳
- poj-2187-凸包-旋转卡壳法求直径
- poj2187——Beauty Contest(凸包+旋转卡壳)
- POJ 2187 Beauty Contest 凸包+旋转卡壳
- POJ 2187 —— 凸包 + 旋转卡壳 求多边形的直径
- POJ 2187 Beauty Contest(凸包+旋转卡壳)
- 【计算几何】 Andrew凸包算法 + 旋转卡壳(以求点对最长距离为例) -- 以 POJ 2187 Beauty Contest 为例
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
- Poj 2187 Beauty Contest_旋转凸包卡壳
- POJ 2187 Beauty Contest(旋转卡壳求点凸包直径)
- POJ 2187 Beauty Contest(凸包,旋转卡壳)