题目描述

农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。

输入输出格式

输入格式:

输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。

输出格式:

输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。

输入输出样例

输入样例#1:

4
4 8
4 12
5 9.3
7 8
输出样例#1:

12.00

说明

题目翻译来自NOCOW。

USACO Training Section 5.1

题目求的就是凸包的周长,求出凸包以后算一遍就行了。

(下面是我打了一半的二维几何的板子)

/*
这里用来存坑:
1.利用叉积求和三角形面积有关的别忘了除二
2.还差旋转卡壳和半平面交
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<ctime>
#define ll long long
#define maxn 10005
using namespace std;
const double eps=0.000000001;
bool flag=; inline int zt(double x){
if(fabs(x)<=eps) return ;
if(x>) return ;
return -;
} struct node{
double x,y;
//极角
double omega;
//数乘
node operator *(const double& u)const{
return (node){x*u,y*u};
}
//点+向量 or 向量+向量 (点+点没有意义)
node operator +(const node& a)const{
return (node){x+a.x,y+a.y};
}
//点-点得到向量
node operator -(const node& a)const{
return (node){x-a.x,y-a.y};
}
//为了按极角排序
bool operator <(const node& a)const{
return zt(omega-a.omega)==-;
}
}c[maxn],q[maxn],ret[maxn];
//按x第一关键字,y第二关键字升序排序
bool cmp(node x,node y){
if(!zt(x.x-y.x)) return zt(x.y-y.y)<;
else return zt(x.x-y.x)<;
} //判断两个点是否重合
bool eq(node x,node y){
return (!zt(x.x-y.x)&&!zt(x.y-y.y));
} //点积
inline double pointmul(node x,node y){
return x.x*y.x+x.y*y.y;
} //叉积
inline double Xmul(node x,node y){
return x.x*y.y-x.y*y.x;
} //两个向量夹角
inline double getthita(node x,node y){
double now=pointmul(x,y)/pointmul(x,x)/pointmul(y,y);
//acos和asin损失精度比较厉害,所以可以转化成点之后用atan2
return atan2(sqrt(-now*now),now);
} //求一个向量旋转thita角之后得到的向量
inline node rotate(node l,double thita){
double co=cos(thita),si=sin(thita);
return (node){l.x*co-l.y*si,l.x*si+l.y*co};
} //两点间距离
inline double dist(node x,node y){
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
} struct lines{
//点向法表示直线
node base,vec;
}; //两直线交点
inline node pub(lines a,lines b){
return a.base+a.vec*fabs(Xmul(a.base-b.base,b.vec)/Xmul(a.vec,b.vec));
} //求多边形(可以不凸,但是各边不能乱交)
inline double S(node *u,int len){
if(!flag){
//如果不是求出凸包后得到的多边形的话还需要按照极角排序。
//不过如果是求出的凸包之后的多边形极角已经是有序的了。
for(int i=;i<=len;i++) u[i].omega=atan2(u[i].y,u[i].x);
sort(u+,u+len+);
} double an=;
for(int i=;i<=len;i++) an+=Xmul(u[i-],u[i]);
an+=Xmul(u[len],u[]); return an/2.00;
} //把点集u变成一个凸包(而且极角已经有序),并返回凸包上点的个数
inline int get_hill(node *u,int len){
//求凸包的话得按x和y坐标排序
sort(u+,u+len+,cmp);
int tt=,tot=; //下凸包
q[]=u[],q[]=u[],tt=;
for(int i=;i<=len;i++){
while(tt>&&zt(Xmul(q[tt]-q[tt-],u[i]-q[tt]))<) tt--;
q[++tt]=u[i];
}
for(int i=;i<=tt;i++) ret[++tot]=q[i]; //上凸包
q[]=u[],q[]=u[],tt=;
for(int i=;i<=len;i++){
while(tt>&&zt(Xmul(q[tt]-q[tt-],u[i]-q[tt]))>) tt--;
q[++tt]=u[i];
}
for(int i=tt;i;i--) if(!eq(q[i],ret[tot])&&!eq(q[i],ret[])) ret[++tot]=q[i]; for(int i=;i<=tot;i++) u[i]=ret[i];
flag=;
return tot;
} int n;
double B; inline void solve(int problem_id){
if(problem_id==){
scanf("%d%lf",&n,&B);
for(int i=;i<=n;i++) scanf("%lf%lf",&c[i].x,&c[i].y);
printf("%.4lf\n",B*S(c,n));
} if(problem_id==){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lf%lf",&c[i].x,&c[i].y);
n=get_hill(c,n); double ans=;
for(int i=;i<=n;i++) ans+=dist(c[i],c[i-]);
ans+=dist(c[],c[n]); printf("%.2lf\n",ans);
}
} int main(){
srand(time());
solve(rand()%+);
return ;
}

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows的更多相关文章

  1. 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows || 凸包模板

    整篇都是仅做记录... 蓝书上的板子.水平序,单调栈.先求下凸包,再求上凸包.叉积的作用是判定向量的位置关系. 48行的作用是在求上凸包的时候不至于去删下凸包中的点.上凸包中第一个点被认为是t1. 另 ...

  2. P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

  3. [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)

    题目大意:求一个点集凸包边长 题解:求凸包,直接求 卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型 C++ Code: #include <al ...

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

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

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

    题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*c ...

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

    题意 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 ...

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

    Problem surface 戳我 Meaning 坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 这道题就是一道凸包的模板题啊,只要求出凸包后在计算就好了,给出几个注意点 记得检查是否有吧 ...

  8. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  9. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...

随机推荐

  1. MySQL 数据库性能优化之缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  2. ubunut14.04 mentohust配置

      1.设置网卡eth0的IP地址和子网掩码 sudo ifconfig eth0 10.162.32.94 netmask 255.0.0.0 将IP地址改为:10.162.32.94,子网掩码改为 ...

  3. Android百度定位API的使用

    导入库文件 在下载页面下载最新的库文件.将liblocSDK2.4.so文件拷贝到libs/armeabi目录下.将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性->Java B ...

  4. 图片和base64编码字符串 互相转换,图片和byte数组互相转换

    图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ...

  5. Git菜鸟

    1.git 和svn的差异 git和svn 最大的差异在于git是分布式的管理方式而svn是集中式的管理方式.如果不习惯用代码管理工具,可能比较难理解分布式管理和集中式管理的概念.下面介绍两种工具的工 ...

  6. Exceptioninthread"main"java.lang.ClassNotFoundsException的问题

    报错如下: Exceptioninthread"main"java.lang.ClassNotFoundsException 大致可以判断出是无法定位到main方法,应该是用mav ...

  7. svn无法checkout大文件的解决办法

    美术组同事checkout出现,在网络好的情况下,有同事更新下来了,后来在配置文件http.conf的最后加入下面压缩参数才解决问题,配置如下: <IfModule deflate_module ...

  8. angular2框架搭建,angular-cli使用,angular2学习

    angular红红火火很多年了,一眨眼ng4都出来了,我也只能叹息前端的日新月异,以及感叹自己永远追赶不上时代的步伐,但是没关系,一个优秀的前端不在于他懂的无数的框架,而在于遇到问题时候懂得如何学习, ...

  9. 全局axios默认值 和 自定义实例默认值

    首先说了一下情况, 登录后成功返回token 然后在带着token去继续下面的请求, 奇怪的是都是当前页面起作用,刷新和跳转之后就token 就消失了. 查了 axios文档发现 被自己坑了 我设置了 ...

  10. python升级3.6后 yum出错File "/usr/bin/yum", line 30 ^

    问题描述: # yum provides ifconfig File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ ...