【BZOJ 1185】 凸包+旋转卡壳
Description
【分析】
打计算几何真的可以哭出来。。。
跟那个求线段最远点差不多,这题弄三个东西转一转,一个表示左端最远点,一个表示右端最远点,一个表示上面最远点。
左右两边的最远点用点积判断,上方最远点用差积判断。
【向量是最好的解决平面几何问题的,不要画图!!!哭!!!
输出那里,用的是向量加减法,乘一个比例系数,然后还用到了垂直单位向量。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 50010 const double eps=0.0000001;
const double INF=; struct P
{
double x,y;
}a[Maxn],t[Maxn];
int len,n; P operator - (P x,P y)
{
P tt;
tt.x=x.x-y.x;
tt.y=x.y-y.y;
return tt;
} P operator * (P x,double y)
{
P tt;
tt.x=x.x*y;
tt.y=x.y*y;
return tt;
} P operator + (P x,P y)
{
P tt;
tt.x=x.x+y.x;
tt.y=x.y+y.y;
return tt;
} double myabs(double x) {return x>?x:-x;} int fbs(double x)
{
if(myabs(x)<=eps) return ;
return x<?-:;
} double Dot(P x,P y) {return x.x*y.x+x.y*y.y;}
double Cross(P x,P y) {return x.x*y.y-x.y*y.x;}
bool cmp(P x,P y) {return fbs(x.x-y.x)==?(x.y<y.y):(x.x<y.x);} void chull()
{
sort(a+,a++n,cmp);
len=;
for(int i=;i<=n;i++)
{
while(len>&&Cross(t[len]-t[len-],a[i]-t[len])<=) len--;
t[++len]=a[i];
}
int k=len;
for(int i=n-;i>=;i--)
{
while(len>k&&Cross(t[len]-t[len-],a[i]-t[len])<=) len--;
t[++len]=a[i];
}len--;
t[]=t[len];
} void output()
{
for(int i=;i<len;i++)
{
printf("%lf %lf\n",t[i].x,t[i].y);
}printf("\n");
} double ans;
P op[]; void RC()
{
double L,R,H,D;
ans=INF;
int l=,r=,h=;
for(int i=;i<len;i++)
{
int j=(i+)%len;
// l=i;r=j;h=j;
// printf("%lf %lf\n",(t[h+1]-t[i]).x,(t[h+1]-t[i]).y);
// printf("%lf %lf\n",(t[h+1]-t[j]).x,(t[h+1]-t[j]).y);
while(Cross(t[h]-t[i],t[h]-t[j])<=Cross(t[h+]-t[i],t[h+]-t[j])) h=(h+)%len;
while(Dot(t[i]-t[j],t[r]-t[j])>=Dot(t[i]-t[j],t[r+]-t[j])) r=(r+)%len;
if(i==) l=r; // printf("%lf %lf\n",Dot(t[j]-t[i],t[l]-t[i]),Dot(t[j]-t[i],t[l+1]-t[i]));
while(Dot(t[j]-t[i],t[l]-t[i])>=Dot(t[j]-t[i],t[l+]-t[i])) l=(l+)%len; D=sqrt(Dot(t[i]-t[j],t[i]-t[j]));
H=Cross(t[h]-t[i],t[h]-t[j])/D;
L=-Dot(t[j]-t[i],t[l]-t[i])/D;
R=-Dot(t[i]-t[j],t[r]-t[j])/D; // printf("**%lf %lf %lf %lf\n",D,H,L,R); double now=(R+L+D)*H;
// printf("%lf %lf %d %d %d %lf\n",t[i].x,t[i].y,l,r,h,now);
if(now<ans)
{
ans=now;
op[]=t[i]-(t[j]-t[i])*(L/D);
op[]=t[j]-(t[i]-t[j])*(R/D);
P tt;
tt.x=(t[i]-t[j]).y;tt.y=-(t[i]-t[j]).x;
op[]=op[]+tt*(H/D);
op[]=op[]+tt*(H/D);
// op[0]=t[i];op[1]=t[j];op[2]=t[r];op[3]=t[l];
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
chull();
// output();
RC();
int fr=;
for(int i=;i<;i++) if(op[i].y<op[fr].y||fbs(op[fr].y-op[i].y)==&&op[i].x<op[i].x) fr=i;
printf("%.5lf\n",ans);
for(int i=;i<;i++)
{
if(fbs(op[i].x)==) op[i].x=;
if(fbs(op[i].y)==) op[i].y=;
}
// for(int i=0;i<4;i++) op[i].x=myabs(op[i].x),op[i].y=myabs(op[i].y);
for(int i=;i<;i++)
{
printf("%.5lf %.5lf\n",op[(fr+i)%].x,op[(fr+i)%].y);
}
return ;
}
调试过程不删了,心酸。。
2016-12-15 16:55:18
【BZOJ 1185】 凸包+旋转卡壳的更多相关文章
- bzoj 1069 凸包+旋转卡壳
题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...
- [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)
http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...
- UVA 4728 Squares(凸包+旋转卡壳)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
- Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)
题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...
- poj 2079 Triangle (二维凸包旋转卡壳)
Triangle Time Limit: 3000MS Memory Limit: 30000KB 64bit IO Format: %I64d & %I64u Submit Stat ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- POJ 2187 凸包+旋转卡壳
思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说 凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...
- BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...
- bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳
题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
随机推荐
- (转)印度建全球最大生物识别数据库,MongoDB安全受质疑
受棱镜门影响,各界对Aadhar的质疑从是否将威胁人民隐私与安全,转而聚焦在 Aadhar 搜集.储存以及处理资料的方法,以及美国新创公司 MongoDB 在计划中扮演的角色. 泱泱大国印度一直以来都 ...
- Hash function
Hash function From Wikipedia, the free encyclopedia A hash function that maps names to integers fr ...
- Java使用基本JDK操作ZIP文件以及zip文件的加密、解密等功能
Java使用基本JDK操作ZIP文件 http://blog.csdn.net/zhyh1986/article/details/7723649 Java解压和压缩带密码的zip文件 http://b ...
- 【转】DataGridView显示行号
ref:http://blog.csdn.net/xieyufei/article/details/9769631 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件 ...
- Div 内部所有元素 全部垂直对齐
http://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-div How it works: ...
- webpack+react+jquery和jquery插件
要引入jquery插件 全局引入jquery plugins : [new webpack.ProvidePlugin({ $: 'jquery', jQuery:'jquery' "win ...
- 使用commons-fileUpload组件上传文件
在近期的一个项目中有用到commons-fileUpload组件进行实现文件上传的功能(由于没用到框架),在使用的过程中有遇到一些问题,经过自己的琢磨也算顺利地将其解决了,在这里做个记录. 一.com ...
- VB 核心编程及通用模块开发 笔记1
前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- hbase on spark
1.在spark的伪分布式环境下安装HBASE (1)版本:我使用的spark版本是1.3.0,使用的hbase版本是hbase-0.94.16 (2)解压,tar zxvf hbase-0.94. ...

