计算几何之凸包

      本来弄了个独立博客,想用那个的,不习惯,还是用博客园吧。那个留着吓弄吧。

      在家了4天,玩了3天半,那半天学会凸包,临走回家,拿了两本书,C++ primer和黑书,还有浙大的模板,天天玩,这是要跪的节奏啊。

      学凸包,黑书上讲的特好。。。

      凸包,原来以为听高端的。其实,也不难的。看着黑书,和浙大模板,把POJ计划上凸包两个题,秒掉应该是没有问题的。我看那个版本的浙大模板有点问题,没有考虑所有的点都共线的情况。

      期间一场CF,让我给睡过去了,scf在家做了,我好惭愧。。。回家了就是想睡觉额。。。

      POJ 2187 Beauty Contest 凸包之后,求最远点距离平方,1113跟这个一模一样,就是加上一个圆的周长(智商拙计额)。。

 1 #include <iostream>//POJ 2187

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cmath>

 5 #include <algorithm>

 6 using namespace std;

 7 #define LL __int64

 8 #define N 50001

 9 #define eps 1e-6

10 struct Point

11 {

12     int x,y;

13 } p[N];

14 int s[N];

15 int top,n;

16 int det(int x1,int y1,int x2,int y2)

17 {

18     return x1*y2 - x2*y1;

19 }

20 int cross(Point a,Point b,Point c)//线段ac与线段bc叉积

21 {

22     return det(a.x - c.x,a.y - c.y,b.x - c.x,b.y - c.y);

23 }

24 int dis(Point a,Point b)

25 {

26     return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);

27 }

28 bool cmp(Point a,Point b)

29 {

30     double t;

31     t = cross(a,b,p[0]);

32     if(t > 0||(t == 0&&dis(a,p[0]) < dis(b,p[0])))

33         return true;

34     else

35         return false;

36 }

37 

38 int main()

39 {

40     int i,maxz,j;

41     Point temp;

42     scanf("%d",&n);

43     for(i = 0; i < n; i ++)

44     {

45         scanf("%d%d",&p[i].x,&p[i].y);

46         if((p[i].y < p[0].y)||(p[i].y == p[0].y&&p[i].x < p[0].x))

47         {

48             temp = p[i];

49             p[i] = p[0];

50             p[0] = temp;

51         }

52     }

53     sort(p+1,p+n,cmp);

54     for(i = 0; i < 3; i ++)

55     {

56         s[i] = i;

57     }

58     top = 2;

59     for(i = 3; i < n; i ++)

60     {

61         while(top >= 1&&cross(p[i],p[s[top]],p[s[top-1]]) >= 0)

62             top -- ;

63         s[++top] = i;

64     }

65     maxz = 0;

66     for(i = 0;i <= top;i ++)

67     {

68         for(j = 0;j <= top;j ++)

69         {

70             if(maxz < dis(p[s[i]],p[s[j]]))

71             maxz = dis(p[s[i]],p[s[j]]);

72         }

73     }

74     printf("%d\n",maxz);

75     return 0;

76 }

 

你可能感兴趣的:(计算)