poj 2187

来源:互联网 发布:微信自媒体 知乎 编辑:程序博客网 时间:2024/06/10 21:07

题意:求最远点对。
思路:旋转卡壳入门题。

AC代码

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <stack>#include <queue>#include <vector>#include <cmath>#include <map>#include <set>#define ll long long#define llu unsigned long longusing namespace std;const double eps = 1e-8;const double PI  = 3.1415926;struct Point {    double x,y;    Point (double x = 0,double y = 0) : x(x),y(y) {}};Point p[100500],s[100500];struct Line{    Point a,b;};Line line[100];int indl,indp;bool dcmp(double x) {    if(fabs(x)-0.0 <= eps) return true;    return false;}double dis(Point a,Point b) {    return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);}double cross(Point a,Point b,Point c) {    if(dcmp((b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y))) return 0;    return ((b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y));}int n;double l;bool cmp1(Point a,Point b) {    if(a.x != b.x) return a.x < b.x;    else return a.y<b.y;}bool cmp2(Point a,Point b) {    double m = cross(p[1],a,b);    if(dcmp(m)) {        return dis(p[1],b) > dis(p[1],a) ? true : false;    }else {        if(m > 0) return true;        else return false;    }}void RC(int m) {//    if(m  == 2) {//        printf("%d\n",(int)(dis(s[1],s[2]))); return ;//    }    double ans = 0.0;    s[m+1] = s[1];    int indy = 2;    for(int i=1;i<=m;i++) {        while(cross(s[i],s[i+1],s[indy+1]) > cross(s[i],s[i+1],s[indy])) {            indy++;            if(indy == m+1) indy=1;        }        ans = max(ans,dis(s[i],s[indy]));    }    printf("%lld\n",(ll)ans);}Point A;int main(){        scanf("%d",&n);        for(int i=1;i<=n;i++) {            scanf("%lf%lf",&p[i].x,&p[i].y);        }        sort(p+1,p+n+1,cmp1);        sort(p+2,p+n+1,cmp2);        s[1] = p[1];        s[2] = p[2];        int top=2;        for(int i=3;i<=n;i++) {            while(top>=2 && cross(s[top-1],s[top],p[i]) <= 0) top--;            s[++top] = p[i];        }        RC(top);    return 0;}
0 0
原创粉丝点击