【题解】二维凸包

【题解】二维凸包

呵呵呵复习一下这个东西免得做到计算几何连暴力都不会嘤嘤嘤

免得到时候写斜率优化结果凸包不会了嘤嘤嘤

数学走起:
\[ \vec{a}=(x_1,y_1),\vec{b}=(x_2,y_2) \\ shadow_{|\vec{a} \times\vec{b}|}=x_1y_2-x_2y_1 \]
根据右手螺旋定则。\(shadow\)是我乱搞的符号,虽然我搞不懂为什么是这样,但是这个应该和\(\sin(0.5\pi)=1,\sin0=0\)有关,就不纠结了,也比较好记。

遵循\(anson\)的意见,重载\(\%\)

复杂度在排序\(O(n\log n)\)

搞个\(struct​\)\(struct​\)玩玩。嘿嘿最近代码变sao了 有各种语法操作233(qaq)

#include<bits/stdc++.h>
using namespace std; 
const int maxn=1e4+5;
double stdx,stdy,ans;int n;

struct P{
#define pf(x) ((x)*(x))
      double x,y;
      struct vec{
        double x,y;
        vec(){x=y=0;}
        vec(const P&a,const P&b){x=b.x-a.x;y=b.y-a.y;}
        inline double operator %(const vec& a){return x*a.y-y*a.x;}
      };
      P(){x=y=0;}
      P(double a,double b){x=a;y=b;}
      inline void scan(){scanf("%lf%lf",&x,&y);}
      inline double operator -(P a){return sqrt(pf(x-a.x)+pf(y-a.y));}
      inline bool operator <(P a){
        double ret=vec(P(stdx,stdy),*this)%vec(P(stdx,stdy),a);
        if(ret>0) return 1;
        if(ret!=0) return 0;
        return *this-P(0,0)<a-P(0,0);
      }
#undef pf
}data[maxn];
vector < P > s;

int main(){
#ifndef ONLINE_JUDGE
      freopen("in.in","r",stdin);
      freopen("out.out","w",stdout);
#endif
      scanf("%d",&n);
      data[1].scan();stdx=data[1].x;stdy=data[1].y;
      for(register int t=2;t<=n;++t)
        if(data[t].scan(),data[t].y<stdy)
          stdy=data[t].y,stdx=data[t].x,swap(data[1],data[t]);
      sort(data+2,data+n+1);
      s.push_back(data[1]);
      for(register int t=2;t<=n;s.push_back(data[t]),++t)
        while(s.size()>1&&P::vec(*(s.end()-2),*(s.end()-1))%P::vec(*(s.end()-2),data[t])<0) s.pop_back();
      if(s.size()>2) s.push_back(*s.begin());
      for(register int t=1,edd=s.size();t< edd;++t)
        ans+=s[t]-s[t-1];
      return !printf("%.2lf\n",ans);
}

猜你喜欢

转载自www.cnblogs.com/winlere/p/10611894.html