实现功能:求出二维平面内一对散点的凸包(详见Codevs 1298)

很神奇的算法——先将各个点按坐标排序,然后像我们所知的那样一路左转,求出半边的凸包,然后反过来求另一半的凸包

我以前正是因为总抱着想一步到位的想法,所以每次都跪得很惨(HansBug:事实上这次是我这辈子第一次A掉凸包题)

然后别的没了,就是凸包的基本思想

(顺便输出凸包周长C和面积S)

 type arr=array[..] of longint;
var
i,j,k,l,m,n,m1,m2:longint;
a:array[..,..] of longint;
b,c,d:arr;ans,are:extended;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;x:=a[(l+r) div ,];y:=a[(l+r) div ,];
repeat
while (a[i,]<x) or ((a[i,]=x) and (a[i,]<y)) do inc(i);
while (a[j,]>x) or ((a[j,]=x) and (a[j,]>y)) do dec(j);
if i<=j then
begin
swap(a[i,],a[j,]);
swap(a[i,],a[j,]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if l<j then sort(l,j);
end;
function right(x1,y1,x2,y2:longint):boolean;
begin
exit((x1*y2)>(x2*y1));
end;
function trip(x1,y1,x2,y2,x3,y3:longint):boolean;
begin
exit(right(x2-x1,y2-y1,x3-x2,y3-y2));
end;
function check(x,y,z:longint):boolean;
begin
exit(trip(a[x,],a[x,],a[y,],a[y,],a[z,],a[z,]));
end;
procedure doit(var b:arr;var m:longint);
begin
b[]:=d[];b[]:=d[];j:=;
for i:= to n do
begin
while (j>) and not(check(b[j-],b[j],d[i])) do dec(j);
inc(j);b[j]:=d[i];
end;
m:=j;
end;
begin
readln(n);
for i:= to n do readln(a[i,],a[i,]);
sort(,n);j:=;
for i:= to n do //去重
begin
if (a[i,]<>a[j,]) or (a[i,]<>a[j,]) then
begin
inc(j);
a[j,]:=a[i,];a[j,]:=a[i,];
end;
end;
n:=j;
//求凸包
for i:= to n do d[i]:=i;doit(b,m1);
for i:= to n do d[i]:=n+-i;doit(c,m2);
//两个半边整合
for i:= to m1 do d[i]:=b[i];
for i:= to m2 do d[i+m1-]:=c[i];
//开始计算周长+面积
m:=m1+m2-;ans:=;are:=;
for i:= to m do ans:=ans+sqrt(sqr(a[d[i],]-a[d[i+],])+sqr(a[d[i],]-a[d[i+],])); //周长
for i:= to m do are:=are+a[d[i],]*a[d[i+],]-a[d[i],]*a[d[i+],]; //面积
are:=abs(are)/;
writeln('Convex Hull:');
for i:= to m do writeln(a[d[i],],' ',a[d[i],]);
writeln('C = ',ans::);
writeln('S = ',are::);
readln;
end.

算法模板——计算几何2(二维凸包——Andrew算法)的更多相关文章

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

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

  2. Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积

    Problem A. AerodynamicsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/co ...

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

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

  4. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

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

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

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

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

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

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

  8. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

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

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

随机推荐

  1. Spring mvc配置Json返回

    第一种 配置 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHand ...

  2. 开箱即用 - jwt 无状态分布式授权

    基于JWT(Json Web Token)的授权方式 JWT 是JSON风格轻量级的授权和身份认证规范,可实现无状态.分布式的Web应用授权: 从客户端请求服务器获取token, 用该token 去访 ...

  3. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

  4. php知识点总结(一)

    1.把数组以表格的形式显示 <?php $array = array( '书籍' =>  array( '生活',  '人与自然','动物世界'), '体育用品' =>  array ...

  5. [Scoi2010]游戏

    游戏 Time Limit:5000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status Pra ...

  6. MongoDB基础之十 shared分片

    水平分片实例分布图: mongodb sharding 服务器架构   1. 添加mongdb两个shared实例 # mkdir -p /home/m17 //home/m18 /home/m20 ...

  7. 计算机 计算机语言 常见的DOS命令

    你好 我是大福 你现在看的是大福笔记 我jie的女儿 8年级 在QQ上问我寒假作业 0度的水和0度的冰哪个更冷 什么? 0度水 0度冰这温度不是一样的么? 不可能 肯定没这么简单 她问的意思是不是手放 ...

  8. IO的构造方法

    package com.file; /* File的构造方法: File(String pathname); File(File parent,String child); File(String p ...

  9. 原生JS获取HTML样式并修改

    大家都知道在JavaScript原生操作中获取元素的样式,在实际操作是使用时比较频繁的一件事,这里像大家介绍下获取css样式的方法,希望可以帮助一些需要的人,如果有幸被大牛看到,有更好的办法,欢迎提出 ...

  10. unity中锁定鼠标移动&&隐藏鼠标&&强制是鼠标移动到某一位置

    [System.Runtime.InteropServices.DllImport("user32.dll")] //引入dll public static extern int ...