Luogu P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包【计算几何】【单调栈】【Graham算法】

题目

在这里插入图片描述

思路

这道题我用的是 G r a h a m Graham Graham 算法.
时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)
具体可以阅读这篇博客(看思路就行,代码很鬼畜)。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,top,stack[1000010];
double ans;
struct lzh
{
	double x,y;
}p[1000010];
double cj(double x,double y,double xx,double yy,double xx1,double yy1)
{
	return (xx-x)*(yy1-y)-(xx1-x)*(yy-y);
}
double dis(double x,double y,double xx,double yy)
{
	return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
bool cmp(const lzh&h,const lzh&k)
{
	double w=cj(p[1].x,p[1].y,h.x,h.y,k.x,k.y);
	if(w>0)
	  return 1;
	if(w==0&&dis(h.x,h.y,p[1].x,p[1].y)<dis(k.x,k.y,p[1].x,p[1].y))
	  return 1;
	return 0;
}
int main()
{
	scanf("%lld",&n);
	for(long long i=1; i<=n; i++)
	 {
	 	scanf("%lf%lf",&p[i].x,&p[i].y);
	 	if(i!=1&&p[i].y<p[1].y)
	 	 {
	 	    swap(p[i].x,p[1].x);
	 	    swap(p[i].y,p[1].y);
		 }
		if(i!=1&&p[i].y==p[1].y)
		 if(p[i].x<p[1].x)
		  {
	 	    swap(p[i].x,p[1].x);
	 	    swap(p[i].y,p[1].y);
		  }
	 }
	sort(p+2,p+1+n,cmp);
	stack[1]=1,top=1;
	for(long long i=2; i<=n; i++)
	 {
	 	while(top>1&&cj(p[stack[top-1]].x,p[stack[top-1]].y,p[stack[top]].x,p[stack[top]].y,p[i].x,p[i].y)<=0)
	 	  top--;
	 	stack[++top]=i;
	 }
	stack[top+1]=1;
	for(long long i=1; i<=top; i++)
	   ans+=dis(p[stack[i]].x,p[stack[i]].y,p[stack[i+1]].x,p[stack[i+1]].y);
	printf("%.2lf",ans);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值