【UVA1303】Wall(凸包)
大致题意: 给你一个多边形,要求建一面墙使得墙上的点至少离多边形每个顶点\(R\)的距离,求最短的墙长。
考虑\(R=0\)
考虑当\(R=0\)时,所求的答案显然就是求得的凸包的周长。
因为这堵墙如果向内凹,显然长度只会变大。
考虑所有情况
对于任一情况,我们可以得图如下:
可以发现,答案是绿色部分+紫色部分,而绿色部分=红色部分=凸包周长,紫色部分=圆的周长。
所以答案就是凸包周长+圆的周长,看起来是不是很简单?
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000
using namespace std;
int n,m;const double pi=acos(-1);
struct Point
{
int x,y;I Point(CI a=0,CI b=0):x(a),y(b){}
I Point operator - (Con Point& o) Con {return Point(x-o.x,y-o.y);}
I int operator ^ (Con Point& o) Con {return x*o.y-y*o.x;}
I bool operator < (Con Point& o) Con {return x^o.x?x<o.x:y<o.y;}
I double len() {return sqrt(x*x+y*y);}
}p[N+5];
struct ConvexHull
{
int n;Point p[N+5];I ConvexHull() {n=0;}
};
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int f;char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0,f=1;W(!D) f=c^'-'?1:-1;W(x=tn+(c&15),D);x*=f;}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
I ConvexHull GetConvexHull(CI n,Point *p)//求凸包
{
RI i,t;ConvexHull res;
for(sort(p+1,p+n+1),i=1;i<=n;++i)//排序,正着扫一遍
{
W(res.n>1&&((res.p[res.n]-res.p[res.n-1])^(p[i]-res.p[res.n-1]))<=0) --res.n;
res.p[++res.n]=p[i];
}
for(t=res.n,i=n-1;i;--i)//倒着扫一遍
{
W(res.n>t&&((res.p[res.n]-res.p[res.n-1])^(p[i]-res.p[res.n-1]))<=0) --res.n;
res.p[++res.n]=p[i];
}return res;//返回结果
}
I double PolygonC(Con ConvexHull& x)//凸包周长
{
RI i;double res=0;for(i=1;i^x.n;++i) res+=(x.p[i]-x.p[i+1]).len();
return res+(x.p[x.n]-x.p[1]).len();
}
int main()
{
RI i,Tt;scanf("%d",&Tt);W(Tt--)
{
for(F.read(n,m),i=1;i<=n;++i) F.read(p[i].x,p[i].y);//读入数据
printf("%.0lf\n",PolygonC(GetConvexHull(n,p))+2*pi*m),Tt&&(putchar('\n'),0);//输出答案
}return 0;
}
【UVA1303】Wall(凸包)的更多相关文章
- hdu 1348 Wall (凸包)
Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ 1113 Wall 凸包求周长
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26286 Accepted: 8760 Description ...
- POJ1113 Wall —— 凸包
题目链接:https://vjudge.net/problem/POJ-1113 Wall Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- POJ1113:Wall (凸包:求最小的多边形,到所有点的距离大于大于L)
Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the ...
- POJ1113:Wall (凸包算法学习)
题意: 给你一个由n个点构成的多边形城堡(看成二维),按顺序给你n个点,相邻两个点相连. 让你围着这个多边形城堡建一个围墙,城堡任意一点到围墙的距离要求大于等于L,让你求这个围墙的最小周长(看成二维平 ...
- POJ 1113 - Wall 凸包
此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB ...
- Wall(凸包POJ 1113)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32360 Accepted: 10969 Description On ...
- POJ1113 Wall 凸包
题目大意:建立围墙将城堡围起来,要求围墙至少距离城堡L,拐角处用圆弧取代,求围墙的长度. 题目思路:围墙长度=凸包周长+(2*PI*L),另外不知道为什么C++poj会RE,G++就没问题. #inc ...
- HDU1348 Wall 凸包
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1348 题意:给出一个凸包,求出与凸包距离 L的外圈周长 凸包模板题,练练Andrew算法求出凸包周长再 ...
- POJ 1113 Wall 凸包 裸
LINK 题意:给出一个简单几何,问与其边距离长为L的几何图形的周长. 思路:求一个几何图形的最小外接几何,就是求凸包,距离为L相当于再多增加上一个圆的周长(因为只有四个角).看了黑书使用graham ...
随机推荐
- 爬虫——爬取Ajax动态加载网页
常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 ...
- (三十九)golang--反序列化
反序列化:是指将json字符串反序列化成原来的数据类型. import ( "encoding/json" "fmt" ) type monster struc ...
- what is variable?
what is variable? variable:pytorch中的变量,存储tensor,数值会不断变动 在 Torch 中的 Variable 就是一个存放会变化的值的地理位置. 里面的值会不 ...
- MongoDB自学------(3)MongoDB文档操作
一.插入文档 二.查询文档 三.更新文档 可以看到标题(title)由原来的 "Mongodb" 更新为了 "MongoDBtest". 以上语句只会修改第一条 ...
- 永久清理git中的历史大文件
原文发布于:https://www.chenxublog.com/2019/05/26/remove-git-big-files.html 有写老的git仓库,因为当年的无知,不会用.gitignor ...
- Linux文本文件——管理文本的命令
Linux文本文件——管理文本的命令 摘要:本文主要学习了在Linux中管理文本的命令. cat命令 cat命令用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件,是Con ...
- Laravel 创建指定表 migrate
解决方案:打开创建表的那个 migration 文件,在创建表的方法执行之前加一个判断条件 if (!Schema::hasTable('password_resets')) { Schema::cr ...
- 点击除指定区域外的空白处,隐藏div
<script> $(document).click(function (e) { var $target = $(e.target); //点击.zanpl和.quanzipl以外的地方 ...
- SAP 同一个序列号可以同时出现在2个不同的HU里?
SAP 同一个序列号可以同时出现在2个不同的HU里? 答案是可以的. 如下图示,HU 180141003288里的序列号11810010540121, 而序列号11810010540121已经出现在另 ...
- maven 学习---使用Maven构建项目
要构建一个基于Maven的项目,打开控制台,进入到 pom.xml 文件所放的项目文件夹,并发出以下命令: mvn package 这将执行Maven的“package”阶段. Maven构建生命周期 ...