首页 > 代码库 > poj 2187
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; } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。