• 【HDOJ】3285 Convex Hull of Lattice Points


    凸包模板题目。

     1 /* 3285 */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 #define MAXN 55
    10 
    11 typedef struct {
    12     int x, y;
    13 } Point_t;
    14 
    15 Point_t points[MAXN];
    16 Point_t stack[MAXN];
    17 int top;
    18 
    19 void output(int);
    20 
    21 double dist(Point_t a, Point_t b) {
    22     return sqrt(1.0*(a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
    23 }
    24 
    25 int dist2(Point_t a, Point_t b) {
    26     return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
    27 }
    28 
    29 int cross(Point_t a, Point_t b, Point_t c) {
    30     return (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y);
    31 }
    32 
    33 bool comp(Point_t a, Point_t b) {
    34     int m = cross(points[0], a, b);
    35     return m>0 || (m==0 && dist2(points[0], a)<dist2(points[0], b));
    36 }
    37 
    38 void Graham(int n) {
    39     Point_t p;
    40     int i, j, k;
    41     
    42     p = points[0];
    43     k = 0;
    44     for (i=1; i<n; ++i) {
    45         if (points[i].x<p.x || (points[i].x==p.x && points[i].y<p.y)) {
    46             p = points[i];
    47             k = i;
    48         }
    49     }
    50     points[k] = points[0];
    51     points[0] = p;
    52     
    53     sort(points+1, points+n, comp);
    54     
    55     stack[0] = points[0];
    56     stack[1] = points[1];
    57     top = 1;
    58     
    59     for (i=2; i<n; ++i) {
    60         while(top && cross(stack[top-1], stack[top], points[i])<=0)
    61             --top;
    62         stack[++top] = points[i];
    63     }
    64 }
    65 
    66 int main() {
    67     int t, case_n;
    68     int n;
    69     int i, j, k;
    70     Point_t p;
    71     
    72 #ifndef ONLINE_JUDGE
    73     freopen("data.in", "r", stdin);
    74 #endif
    75 
    76     scanf("%d", &t);
    77     while (t--) {
    78         scanf("%d %d", &case_n, &n);
    79         for (i=0; i<n; ++i)
    80             scanf("%d %d", &points[i].x, &points[i].y);
    81         Graham(n);
    82         printf("%d %d
    ", case_n, top+1);
    83         p = stack[0];
    84         k = 0;
    85         for (i=1; i<=top; ++i) {
    86             if (stack[i].y>p.y || (stack[i].y==p.y && stack[i].x<p.x)) {
    87                 p = stack[i];
    88                 k = i;
    89             }
    90         }
    91         for (i=k; i>=0; --i)
    92             printf("%d %d
    ", stack[i].x, stack[i].y);
    93         for (i=top; i>k; --i)
    94             printf("%d %d
    ", stack[i].x, stack[i].y);
    95     }
    96 
    97     return 0;
    98 }
  • 相关阅读:
    C++官方文档-静态成员
    C++官方文档-this
    C++官方文档-运算符重载
    springboot-dokcer
    HDU 1073
    HDU 1070
    UVa 213
    HDU 1150
    POJ 1274
    POJ 2594
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4200036.html
Copyright © 2020-2023  润新知