洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows
题目描述
农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。
输入输出格式
输入格式:
输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。
输出格式:
输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。
输入输出样例
4
4 8
4 12
5 9.3
7 8
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的更多相关文章
- 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows || 凸包模板
整篇都是仅做记录... 蓝书上的板子.水平序,单调栈.先求下凸包,再求上凸包.叉积的作用是判定向量的位置关系. 48行的作用是在求上凸包的时候不至于去删下凸包中的点.上凸包中第一个点被认为是t1. 另 ...
- P2742 [USACO5.1]圈奶牛Fencing the Cows
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
- [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
题目大意:求一个点集凸包边长 题解:求凸包,直接求 卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型 C++ Code: #include <al ...
- luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...
- P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*c ...
- LG2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 ...
- 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
Problem surface 戳我 Meaning 坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 这道题就是一道凸包的模板题啊,只要求出凸包后在计算就好了,给出几个注意点 记得检查是否有吧 ...
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...
- 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)
题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...
随机推荐
- MySQL:BlackHole
MySQL:BlackHole 顾名思义BlackHole就是黑洞,只有写入没有输出.现在就来实验一下吧 首先查看一下MySQL支持的存储引擎 mysql> show engines;+---- ...
- Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings
E. The Fair Nut and Strings 题目链接:https://codeforces.com/contest/1084/problem/E 题意: 输入n,k,k代表一共有长度为n的 ...
- BS架构下使用消息队列的工作流程
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长. 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有 ...
- bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版
这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...
- [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...
- 【Atcoder】ARC 080 F - Prime Flip
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
- HDU1267 下沙的沙子有几粒? 基础DP
题目链接 题意:给定m个H和n个D(1<=n,m<=20),问这些字母构成的序列中,对于任意位置,从左开始数H的累积个数总是不比D的累计数少的排列有多少种. 题解:二维DP,画一个正方形, ...
- karma和jasmine的测试(包括angular测试)
本篇博客主要就是针对现在日新月异的技术和快速开发,测试被很多人忽略,其实在开发中如何保证代码的质量以及逻辑的完整性,测试显得十分重要,本文就是负责karma+jasmine来测试. 1.搭建测试的环境 ...
- 教你从头到尾利用DQN自动玩flappy bird(全程命令提示,GPU+CPU版)【转】
转自:http://blog.csdn.net/v_JULY_v/article/details/52810219?locationNum=3&fps=1 目录(?)[-] 教你从头到尾利用D ...
- Git服务器安装详解及安装遇到问题解决方案【转】
转自:http://www.cnblogs.com/grimm/p/5368777.html git是一个不错的版本管理的工具.现在自己在搞一个简单的应用程序开发,想使用git来进行管理.在Googl ...