= =回归。。【UVAlive】6859凸包

来源:互联网 发布:林黛玉 知乎 编辑:程序博客网 时间:2024/05/19 00:48

= =这道题看了题面画了画图就没想用凸包做


试了试暴力。。。然而失败了。。。

凸包

用了别人的模板。。。侵删

解题思路:输入数据的时候把一个点变为上下左右的四个点,然后用凸包筛一遍点,需要注意边长只能是1和根号2,因为所有点都在网格上。。

最后直接输出就行

大佬的公式:
double x=fabs(a.x-b.x); double y=fabs(a.y-b.y); return fabs(x-y)+min(x,y)*sqrt(2);



#include<iostream>#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;struct node {    double x;double y;}p[400005],s[400005];int n,m;int sq(int x){    return x*x;}double chaji(node a,node b){    return a.x*b.y-a.y*b.x;}double dist(node a,node b){    double x=fabs(a.x-b.x);    double y=fabs(a.y-b.y);    return fabs(x-y)+min(x,y)*sqrt(2);}node xl(node a,node b){    node c;    c.x=a.x-b.x;    c.y=a.y-b.y;    return c;}bool cmp(node a,node b){    if(a.x==b.x) return a.y<b.y;    else return a.x>b.x;}int main(){    while(scanf("%d",&n)!=EOF)    {      memset(s,0,sizeof(s));        double x,y;int h=0;        for (int i=0;i<n;i++)        {             scanf("%lf%lf",&x,&y);              p[h].x=x-1;p[h++].y=y;              p[h].x=x+1;p[h++].y=y;              p[h].x=x;p[h++].y=y+1;              p[h].x=x;p[h++].y=y-1;            }         sort(p,p+h,cmp);        int tot=0;        for (int i=0;i<h;i++)        {            while(tot>1 && chaji(xl(s[tot-1],s[tot-2]),xl(p[i],s[tot-2]))<=0) tot--;            s[tot++]=p[i];        }        int k=tot;         for (int i=h-2;i>=0;i--)        {            while(tot>k && chaji(xl(s[tot-1],s[tot-2]),xl(p[i],s[tot-2]))<=0) tot--;            s[tot++]=p[i];        }        if(h>1) tot--;        double ans=0.0;        for (int i=0;i<tot;i++)        {        ans+=dist(s[i],s[i+1]);        }        printf("%.4lf\n",ans);    }    return 0;}


原创粉丝点击