Luogu P2742 模板-二维凸包

  • 之前写的实在是太蠢了.于是重新写了一个.
  • 用 \(Graham\) 算法求凸包.
  • 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 \(a\) 的左侧,于是可以用这个方法判断是否弹点.
  • 写的时候注意细节:确定原点时的比较和排序时的比较是不同的,并且排序时不要把原点加入.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=1e4+10;
int n;
struct v2
{
double x,y;
v2(double x=0,double y=0):x(x),y(y) {}
friend double operator * (const v2 &a,const v2 &b)
{
return a.x*b.y-a.y*b.x;
}
friend v2 operator + (const v2 &a,const v2 &b)
{
return v2(a.x+b.x,a.y+b.y);
}
friend v2 operator - (const v2 &a,const v2 &b)
{
return v2(a.x-b.x,a.y-b.y);
}
bool operator < (const v2 &rhs) const
{
return x==rhs.x?y<rhs.y:x<rhs.x;
}
double modulus()
{
return sqrt(x*x+y*y);
}
double angle()
{
return atan2(y,x);
}
}p[MAXN];
v2 origin;
bool cmp(const v2 &a,const v2 &b)
{
double a1=(a-origin).angle();
double a2=(b-origin).angle();
return a1==a2?a.x<b.x:a1<a2;
}
v2 stk[MAXN];
int tp=0;
void ConvexHull()
{
for(int i=2;i<=n;++i)
if(p[i]<p[1])
swap(p[i],p[1]);
origin=p[1];
sort(p+2,p+n+1,cmp);
for(int i=1;i<=n;++i)
{
while(tp>=2 && (stk[tp]-stk[tp-1])*(p[i]-stk[tp])<=0)
--tp;
stk[++tp]=p[i];
}
stk[++tp]=p[1];
}
double calcC()
{
double s=0;
for(int i=1;i<tp;++i)
s+=(stk[i+1]-stk[i]).modulus();
return s;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
{
double x,y;
scanf("%lf%lf",&x,&y);
p[i]=v2(x,y);
}
ConvexHull();
double ans=calcC();
printf("%.2lf\n",ans);
return 0;
}

Luogu P2742 模板-二维凸包的更多相关文章

  1. luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

    题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...

  2. 【洛谷 P2742】【模板】二维凸包

    题目链接 二维凸包板子..有时间会补总结的. #include <cstdio> #include <cmath> #include <algorithm> usi ...

  3. 【计算几何】二维凸包——Graham's Scan法

    凸包 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内.右图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包. 一组平面上的点, ...

  4. UVA 10652 Board Wrapping(二维凸包)

    传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...

  5. 计算几何 二维凸包问题 Andrew算法

    凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...

  6. 使用Graham扫描法求二维凸包的一个程序

    #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...

  7. poj 2079 Triangle (二维凸包旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Stat ...

  8. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  9. luogu P2742 【模板】二维凸包

    嘟嘟嘟 没错,我开始学凸包了. 其实挺简单的. 前置技能: 1.极坐标系 2.向量叉积 1.极坐标系 就是一种二维坐标系.只不过两个坐标分别表示向量和极轴的角度和自身的长度.对于不同的问题,极轴可以自 ...

随机推荐

  1. 关于Vue的component制作dialog组件

    其实原理很简单,兴个粟子, 点击按钮出现 dialog 弹出杠, 将dialog做成一个组件,components/dialog.vue 就是在components里面新建一个vue.将这个vue做为 ...

  2. CountDownLatch await可能存在的问题

    执行countdown的某个子线程可能会因为某些原因无法执行countdown,这样就会导致await线程一直阻塞下去. 在线程池中多次调用await方法,因为await方法会阻塞一段时间,有可能导致 ...

  3. linux与window的\r与\n

    应用程序 void niuniu(void) { char buf[16]; char *p[6]; int i; led_init(); uart_init(); while(1) { puts(& ...

  4. 永久以管理员身份运行cmd

    系统:win7 1,下图输入 cmd,找到cmd 2,发送到桌面快捷方式 3,在桌面上的cmd,右键,属性 点高级,进入后,勾上 管理员.

  5. 如何使用POST 方法调用服务

    一.WCF REST专用POST方法 1.1.        建立WCF REST 方法 [ServiceContract] public interface IBookingBizService { ...

  6. IOS UI-自定义UIColectionView布局

    ViewController.m // // ViewController.m // IOS_0226_自定义UIColectionView布局 // // Created by ma c on 16 ...

  7. Highcharts 基本条形图;Highcharts 堆叠条形图;Highcharts 反向条形图

    Highcharts 基本条形图 配置 chart 配置 设置 chart 的 type 属性 为 bar ,chart.type 描述了图表类型.默认值为 "line". var ...

  8. day5-subprocess模块

    一.概述 实际应用中,有些时候我们不得不跟操作系统进行指令级别的交互,如Linux中的shell.Python中早期通过os模块和commands模块来实现操作系统级别的交互,但从2.4版本开始,官方 ...

  9. C++实现Prim算法

    闲来无聊,前两天看到一篇关于算法实现的文章.里面又关于图的各种算法介绍,正好上学期还学过图论,现在还记得一点点,先来实现个prim算法: 表示图的文件的内容大体上是这样的: 2.0 1.0 1.0 3 ...

  10. PHP实现登录功能DEMO

    PHP实现登录的原理是什么呢?就是利用Session实现的,用户访问网站,系统会自动在服务器生成一个Session文件,这个Session可以用来存储用户的登录信息.好了,这是基本储备,我们下面来实现 ...