poj 2187

求凸包后枚举凸包上的点

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <map>

#include <set>

#include <queue>

#include <stack>

#include <vector>

#include <sstream>

#include <string>

#include <cstring>

#include <algorithm>

#include <iostream>

#define maxn 100010

#define INF 0x7fffffff

#define inf 100000000

#define MOD 1000000007

#define ULL unsigned long long

#define LL long long

using
namespace std;

const
double ESP = 1e-10;

double
add(double
a, double
b) {

    if(abs(a+b) < ESP * (abs(a) + abs(b))) return
0;

    return
a+b;

}

struct
P

{

    double
x, y;

    

    P() {}

    

    P(double
x, double
y) : x(x), y(y) {}

    

    P operator - (P p) {

        return
P(add(x, -p.x), add(y, -p.y));

    }

    P operator + (P p) {

        return
P(add(x, p.x), add(y, p.y));

    }

    P operator * (double
d) {

        return
P(x*d, y*d);

    }

    double
dot(P p) {

        return
add(x*p.x, y*p.y);

    }

    double
det(P p) {

        return
add(x*p.y, - y*p.x);

    }

};

P ps[maxn];

int
n;

bool
cmp_x(const
P& p, const
P& q) {

    if(p.x != q.x) return
p.x < q.x;

    return
p.y < q.y;

}

vector<P> convex_full() {

    sort(ps, ps+n, cmp_x);

    int
k = 0;

    vector<P> qs(n*2);

    for(int
i = 0; i < n; ++ i) {

        while(k > 1 && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) <= 0)

            -- k;

        qs[k++] = ps[i];

    }

    for(int
i = n-2, t = k; i >= 0; -- i) {

        while(k > t && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) <= 0)

            -- k;

        qs[k++] = ps[i];

    }

    qs.resize(k-1);

    return
qs;

}

double
dist(P p, P q) {

    return
(p-q).dot(p-q);

}

void
solve() {

    vector<P> qs = convex_full();

    // printf("%d\n", qs.size());

    double
res = 0;

    for(int
i = 0; i < (int)qs.size(); ++ i) {

        for(int
j = 0; j < i; ++ j) {

            res = max(res, dist(qs[i], qs[j]));

        }

    }

    printf("%.0lf\n", res);

}

int
main()

{

    while(scanf("%d", &n) == 1) {

        for(int
i = 0; i < n; ++ i) {

            scanf("%lf%lf", &ps[i].x, &ps[i].y);

        }

        solve();

    }

    return
0;

}

  

时间: 2024-10-27 13:17:45

poj 2187的相关文章

POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法

水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较多. 水平序算法需要扫描两次,但排序简单,讨论简单,不易出错. [算法流程] 1.对顶点按x为第一关键字,y为第二关键字进行排序. 2.准备一个空栈,并将前两个点压入栈. 3.对于每一个顶点A,只要栈顶中还至少两个顶点,记栈顶为T,栈中第二个为U. 若UT(向量) * TA(向量) <= 0, 则将

【POJ 2187】 Beauty Contest (凸包-Graham扫描算法)

[POJ 2187] Beauty Contest (凸包-Graham扫描算法) 找平面最远点对 数据很大 用暴力会T..我感觉-- 扫描出个凸包 然后枚举凸包上的点即可 没坑 int也可过 注意重边跟共线就行 代码下附赠几组数据 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include

poj 2187 最远点对

题意: 给出n个点,求最远点对的距离. 限制: 2 <= n <= 5*1e4 思路: 凸包,旋转卡壳 /*poj 2187 题意: 给出n个点,求最远点对的距离. 限制: 2 <= n <= 5*1e4 思路: 凸包,旋转卡壳 */ #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cmath> using

poj 2187 Beauty Contest——旋转卡壳

题目:http://poj.org/problem?id=2187 学习材料:https://blog.csdn.net/wang_heng199/article/details/74477738 https://www.jianshu.com/p/74c25c0772d6 可以再倒着枚举一遍那样求凸包. 用叉积算面积来旋转卡壳. 注意在面积等于的时候就不要往后走了,不然只有两个点的数据就会死循环. #include<cstdio> #include<cstring> #inclu

poj 2187 N个点中输出2点的最大距离的平方

旋转卡壳 Sample Input 40 00 11 11 0Sample Output 2 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <string> 6 # include <cmath> 7 # include <queue> 8 # define LL l

POJ 2187 求凸包上最长距离

简单的旋转卡壳题目 以每一条边作为基础,找到那个最远的对踵点,计算所有对踵点的点对距离 这里求的是距离的平方,所有过程都是int即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 #

poj 2187【旋转卡壳】

求平面最远点对 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=50005; int n,w=1,top; double ans; struct dian { double x,y; dian(double X=0,double Y=0) { x=X,y=Y; } dian operator + (

POJ 2187 Beauty Contest

题意: 题目链接 给定 \(n\) 个点,求距离最远的两个点之间的距离,输出最远距离的平方 \(n<=50000\) 思路: 旋转卡壳... 注意事项: 数组名称不要弄混了 code: #include<cstdio> #include<algorithm> using namespace std; const int N=50005; int n,top,per[N],res; struct point{int x,y;int dist(){return x*x+y*y;}

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递