首页 > 其他分享 >二维凸包复习笔记

二维凸包复习笔记

时间:2024-01-29 14:46:00浏览次数:27  
标签:cnt 复习 h2 double t1 二维 凸包 tmp1 tmp2

  • Graham扫描法
  • 向量的叉乘:平行四边形面积,顺负逆正,x1y2-x2y1
    1.确定1个凸包上的点:纵坐标最小(纵坐标相同时横坐标最小)的点
    2.极角排序
    3.单调栈维护凸包
点击查看代码
//二维凸包 
#include <bits/stdc++.h>
using namespace std;
struct t1
{
	double x,y;
}t[100005];
int s[100005];
double c(t1 a,t1 b)
{
	return a.x*b.y-a.y*b.x;
}
double d(t1 a,t1 b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(t1 a,t1 b)
{
	t1 tmpa,tmpb;
	tmpa.x=a.x-t[1].x;
	tmpa.y=a.y-t[1].y;
	tmpb.x=b.x-t[1].x;
	tmpb.y=b.y-t[1].y;
	double tmp=c(tmpa,tmpb);
	if(tmp>0||tmp==0&&d(t[1],a)<d(t[1],b))
	{
		return true;
	}
	return false;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%lf%lf",&t[i].x,&t[i].y);
		if(t[i].y<t[1].y||t[i].y==t[1].y&&t[i].x<t[1].x)
		{
			swap(t[i],t[1]);
		}
	}
	sort(t+2,t+n+1,cmp);
	int cnt=1;
	s[1]=1;
	for(int i=2;i<=n;i++)
	{
		while(cnt>1)
		{
			t1 h1=t[s[cnt]],h2=t[s[cnt-1]];
			t1 tmp1,tmp2;
			tmp1.x=t[i].x-h2.x;
			tmp1.y=t[i].y-h2.y;
			tmp2.x=h1.x-h2.x;
			tmp2.y=h1.y-h2.y;
			if(c(tmp1,tmp2)>=0)
			{
				cnt--;
			}
			else
			{
				break;
			}
		}
		cnt++;
		s[cnt]=i;
	}
	cnt++;
	s[cnt]=1;
	double ans=0;
	for(int i=1;i<cnt;i++)
	{
		ans+=d(t[s[i]],t[s[i+1]]);
	}
	cout<<fixed<<setprecision(2)<<ans<<endl;
	return 0;
}

标签:cnt,复习,h2,double,t1,二维,凸包,tmp1,tmp2
From: https://www.cnblogs.com/watersail/p/17994474

相关文章

  • 微信小程序:生成二维码
    wxml<view><buttonbindtap='createQrcode'type="primary"style="width:400rpx;margin-top:400rpx;">生成二维码</button><canvasid='qrcode'type="2d"style='width:300rpx;height:30......
  • 二维动态规划(上)
    二维动态规划64.最小路径和intmin(inta,intb){returna>b?b:a;}//从(0,0)到(i,j)的最小路径和,只能向右或向下移动intrecursive(int**grid,inti,intj){if(i==0&&j==0)returngrid[0][0];intup=0x7fffffff;intleft=0x7......
  • 复习一下构建工具,淘天集团前端一面
    1.Webpack的构建原理Webpack的构建原理就是将多个模块打包成一个或多个静态资源文件的过程。它的构建原理可以简单概括为以下几个步骤:入口点:Webpack通过指定一个或多个入口点来启动构建过程。每个入口点表示一个模块,可以是JavaScript、CSS、图片等任何类型的文件。模块解析:We......
  • (坚持每天写算法)算法复习与学习part1基础算法part1-12——双指针算法
    双指针是一种思路,很多题都可能用得到,这里我就只选取Acwing网站的三道题(事实上我最近就是在这里刷题,leetcode反而不怎么去了,刷完这个网站的我就会去leetcode刷了)双指针一般来讲会在数组有序的情况下应用,但是如果是无序的也是有可能的,两个指针会遍历整个数组(如果条件允许的......
  • nodejs带图标的二维码
    前言实现用nodejs生成二维码一、生成二维码先下载qrcode模块,可以使用npminstall--saveqrcode/**@paramstext文本数据@paramscallback回调函数*/vargetQrcode=function(text,callback){constoptions={width:256,height:256,......
  • WebGL之二维矩阵变换(高级)
    一,index.html<body> <scriptsrc="js/common/shaderUtil.js"></script> <scriptid="vertex-shader-2d"type="notjs"> attributevec2a_position; attributevec2a_texCoord; uniformmat3u_matrix;//2D变......
  • 【每日GIS算法】(1)二维矢量的运算
    二维向量的基础运算主要有以下几种矢量的加法矢量的减法矢量的乘法矢量的除法矢量的模矢量的点乘矢量的叉乘矢量的归一化针对不同的场景,我们为二维矢量类提供对应的实例方法,但是由于这些实例方法会修改对象内部的数值,因此还提供对应的静态方法,在不改变原来的向量的情况......
  • iOS 多线程复习
    iOS中的线程主要有四种:1.pThread2.NSThread3.GCD4.NSOpreaction基础知识:线程、任务和队列的概念: 异步、同步&并行、串行的特点:组合特点:  1.pThread C语言所写,面向过程,使用较少.oc:#pragmaMark-pThread-(void)pThreadDemo{pthread_tpthre......
  • Ybt 金牌导航 6.1.H. 时空旅行 / P5416 [CTSC2016] 时空旅行(线段树分治+凸包)
    题意简述初始有版本\(0\),其中仅包含点\(0\),且\(c_0\)给出,\(x_0=0\)。对于第\(i\)个版本,它依赖第\(fr_i\)个版本,而且会在父级版本的基础上进行以下两种操作之一:插入一个新点,并且会给出\(x_i\)和\(c_i\)。删除一个本就存在的点(不为\(0\))给出\(m\)次询问,每次给出......
  • 微信小程序之条形码和二维码
    整个示例目录:index.wxml代码: <view class="container page">  <view class="panel">    <view class="header">    </view>    <view class="barcode">      <view class="barnum">......