• bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘


    同上(什么都不用改)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<map>
     6 #define N 100005
     7 #define eps 1e-8
     8 using namespace std;
     9 int top,n;
    10 double ans;
    11 struct point{double x,y;}p[N],s[N];
    12 inline double dis(point a, point b)
    13 {
    14     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    15 }
    16 inline double cross(point p1, point p2, point p0)
    17 {
    18     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
    19 }
    20 inline bool cmp(point a, point b)
    21 {
    22     if (cross(a,b,p[0])==0) return dis(a,p[0])<dis(b,p[0]);
    23     return cross(a,b,p[0])>0;
    24 } 
    25 void Graham()
    26 {
    27     int k=0; top=2;
    28     for (int i=1; i<n; i++) 
    29         if (p[k].y>p[i].y || (p[i].y==p[k].y && p[k].x>p[i].x)) k=i;
    30     point t=p[0]; p[0]=p[k]; p[k]=t;
    31     sort(p+1,p+n,cmp);
    32     s[0]=p[0]; s[1]=p[1]; s[2]=p[2];
    33     for (int i=3; i<n; i++)
    34     {
    35         while (top && cross(p[i],s[top],s[top-1])>=0) top--;
    36         s[++top]=p[i];
    37     }
    38     s[++top]=p[0];
    39     for (int i=0; i<top; i++)
    40         ans+=dis(s[i],s[i+1]);
    41 }
    42 int main()
    43 {
    44     scanf("%d",&n);
    45     for (int i=0; i<n; i++) 
    46         scanf("%lf%lf",&p[i].x,&p[i].y);
    47     Graham();
    48     printf("%.2lf",ans);
    49     return 0;
    50 }
  • 相关阅读:
    序列终结者
    CF696C PLEASE
    [清华集训]Rmq Problem / mex
    CF786B Legacy
    链表结构详解
    synchronized同步方法和同步代码块的区别
    关于守护线程定义
    线程的优先级
    mysql查询当天的数据
    java以正确的方式停止线程
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6480891.html
Copyright © 2020-2023  润新知