凸包

https://www.luogu.com.cn/problem/P2742


//author:kzssCCC

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

namespace geometry{
	const double eps = 1e-9;

	int sgn(double x){
		if (std::abs(x)<=eps) return 0;
		else if (x>eps) return 1;
		else return -1;
	}

	double dmax(double x,double y){return sgn(x-y)>=0?x:y;}
	double dmin(double x,double y){return sgn(x-y)<0?x:y;}

	struct point{
		double x,y;
		point(int x=0,int y=0):x(x),y(y){}
		point(double x,double y):x(x),y(y){}

		point operator+(const point& p)const{return {x+p.x,y+p.y};}
		point operator-(const point& p)const{return {x-p.x,y-p.y};}
		point operator*(double k)const{return {x*k,y*k};}
		friend point operator*(double k,const point& p){return {p.x*k,p.y*k};}
		point operator/(double k)const{assert(sgn(k)!=0);return {x/k,y/k};}
		double operator*(const point& p)const{return x*p.x+y*p.y;}
		double operator^(const point& p)const{return x*p.y-y*p.x;}

		point& operator+=(const point& p){x+=p.x,y+=p.y;return *this;}
		point& operator-=(const point& p){x-=p.x,y-=p.y;return *this;}
		point& operator*=(double k){x*=k,y*=k;return *this;}
		point& operator/=(double k){assert(sgn(k)!=0);x/=k,y/=k;return *this;}

		bool operator==(const point& p)const{return sgn(x-p.x)==0&&sgn(y-p.y)==0;}
		bool operator!=(const point& p)const{return !(*this==p);}
		bool operator<(const point& p)const{return sgn(x-p.x)!=0?sgn(x-p.x)<0:sgn(y-p.y)<0;}
		
		double len2()const{return x*x+y*y;}
		double len()const{return sqrt(this->len2());}
	};
}
using namespace geometry;

void solve(){
	int n;
	cin >> n;
	vector<point> a(n+1);
	for (int i=1;i<=n;i++){
		cin >> a[i].x >> a[i].y;
	}
	sort(a.begin()+1,a.end());

	vector<int> stk;
	int len = 0;
	for (int i=1;i<=n;i++){
		while (len>=2 && sgn((a[i]-a[stk[len-2]])^(a[i]-a[stk[len-1]]))<=0){
			stk.pop_back();
			len--;
		}
		stk.push_back(i);
		len++;
	}
	int tot = len;
	for (int i=n;i>=1;i--){
		while (len-tot>=2 && sgn((a[i]-a[stk[len-2]])^(a[i]-a[stk[len-1]]))<=0){
			stk.pop_back();
			len--;
		}
		stk.push_back(i);
		len++;
	}

	double res = 0;
	for (int i=1;i<len;i++){
		res += (a[stk[i]]-a[stk[i-1]]).len();
	}	
	cout << fixed << setprecision(2) << res << '\n';
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int t = 1;
	// cin >> t;
	while (t--) solve();

	return 0;
}
posted @ 2026-04-14 00:46  kzssCCC  阅读(12)  评论(0)    收藏  举报