【题解】二维凸包
呵呵呵复习一下这个东西免得做到计算几何连暴力都不会嘤嘤嘤
免得到时候写斜率优化结果凸包不会了嘤嘤嘤
数学走起:
\[
\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);
}
原文地址:https://www.cnblogs.com/winlere/p/10611894.html
时间: 2024-10-01 23:30:15