【OI康复训练】POJ2187旋转卡壳

原创 2015年07月10日 17:46:47

随便写一个旋转卡壳,结果有重复点实在是日了狗了

#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 T=1;
  while(T--) {
    int n;
    scanf("%d", &n);
    vector<Point> points;
    for(int i = 0; i < n; i++) {
      int x, y;
      scanf("%d%d", &x, &y);
      points.push_back(Point(x, y));
    }
    printf("%d\n", diameter2(points));
  }
  return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

谈谈我对旋转卡壳算法本质的理解

我学很多东西的过程中,经常无法理解现有的资料的表述,感觉那些讲的太肤浅,最后靠自己推倒证明才能理解,旋转卡壳也是其中的一个…… 关于旋转卡壳的资料,大概有这几个: http://cgm.cs.mcgi...
  • kingpharaoh
  • kingpharaoh
  • 2015年08月20日 14:59
  • 1267

POJ3608(旋转卡壳--求两凸包的最近点对距离)

题目:Bridge Across Islands   分析:以下内容来自:http://blog.csdn.net/acmaker/article/details/3178696   考虑如下的算法,...
  • ACdreamers
  • ACdreamers
  • 2013年08月17日 15:50
  • 3813

BZOJ 1185 [HNOI2007]最小矩形覆盖 旋转卡壳

BZOJ 1185 [HNOI2007]最小矩形覆盖 旋转卡壳
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月09日 18:23
  • 1393

脑梗塞康复训练怎么做成都西华医院

成都西华医院中风脑梗诊疗专家:   一直有朋友咨询脑梗塞康复训练是否有必要,成都西华医院专家来回答大家的疑问,脑梗塞的康复训练做得好的话,对于脑梗塞患者来说就如同重生一般。   首先要保持...
  • httkwfuu
  • httkwfuu
  • 2015年05月11日 21:16
  • 5

(老弱病残康复训练)51nod 2006 飞行员配对 (二分图匹配)

点击打开题目链接 在说二分图匹配之前,必须先点个前置技能:二分图是什么。匹配是什么。 二分图:二分图研究的是一类无向图问题。G=(V,E)是一个无向图,如果定点V可以分割为两个互不相交的自己(X,...
  • PK__PK
  • PK__PK
  • 2018年01月10日 15:04
  • 16

(老弱病残康复训练)51nod 1459 迷宫游戏(最短路)

点击打开题目链接 最短路的算法很多。博主之前也讲了多元最短路的算法(弗洛伊德算法)。在这里介绍一种迪杰斯特拉算法。 迪杰斯特拉算法:这是一种单元最短路算法。也就是说只能求某一个到其他点的最短路。并...
  • PK__PK
  • PK__PK
  • 2018年01月10日 21:44
  • 24

【河工大老弱病残康复训练(2)】--C

Description Olesya loves numbers consisting of n digits, and Rodion only likes numbers that are d...
  • Greenary
  • Greenary
  • 2017年03月03日 22:33
  • 99

海伦儿童康复训练中心留言本 v2.0

  • 2005年08月19日 12:05
  • 0B
  • 下载

基于实物交互的言语康复训练系统

  • 2015年09月26日 18:32
  • 3.31MB
  • 下载

POJ 2187 Beauty Contest(凸包_旋转卡壳之最远点对)

POJ 2187 Beauty Contest(凸包_旋转卡壳之最远点对)
  • u012860063
  • u012860063
  • 2015年03月25日 19:52
  • 715
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OI康复训练】POJ2187旋转卡壳
举报原因:
原因补充:

(最多只允许输入30个字)