【poj2187】最远点对(勉强凑数)

题目简述

输入n个点,及其坐标,n<=50000,所有坐标都是不超过10000的整数组成,没有重点。

问最远点对间的距离的平方是多少

题解

这是一道旋转卡壳的裸题

我们要求这个多边形的直径,这可怎么办呢

首先,最远点对一定在凸包上,我们考虑这样一个凸包

显然的,卡在两个点上,一定可以转化成卡在一个边和一个点上

更显然的,如果卡在一条边上和一个点上,那么这个点一定离这个边最远

那么,这个点和这条边组成的三角形一定是包括这条边的三角形中最大的

再之,假定点i和点i+1卡到了点j

那么随着i增加,j也增加

根据这个单调性,我们可以计算出每条边对应的点了

那么直径也就等于边的端点到对应的点的距离

注意边界即可!

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
typedef double db;
const int N=100001;
struct P{int x,y;} a[N],s[N];
int n,top=0,ans=0;
il P operator-(P a,P b){
    return (P){a.x-b.x,a.y-b.y};
}
il int operator*(P a,P b){
    return a.x*b.y-a.y*b.x;
}
il int dis(P a){
    return a.x*a.x+a.y*a.y;
}
il bool cmp(P x,P y){
    if(abs((x-a[1])*(y-a[1]))>0) return (x-a[1])*(y-a[1])>0;
    return dis(x-a[1])<dis(y-a[1]);
}
il int S(P a,P b,P c){
    return abs((a-b)*(a-c))/2;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    for(int i=2;i<=n;i++)
        if(a[i].y<a[1].y||(a[i].y==a[1].y&&a[i].x<a[1].x))
            swap(a[1],a[i]);
    sort(a+2,a+n+1,cmp);
    top=2;s[1]=a[1];s[2]=a[2];
    for(int i=3;i<=n;i++){
        while(top>1&&(a[i]-s[top-1])*(s[top]-s[top-1])>=0) top--;
        s[++top]=a[i];
    }
    for(int i=0;i<top;i++)
        s[i]=s[i+1];
    n=top;
    for(int i=0,j=2;i<n;i++){
        while(S(s[i],s[(i+1)%n],s[j])<S(s[i],s[(i+1)%n],s[(j+1)%n])) j=(j+1)%n;
        ans=max(dis(s[i]-s[j]),ans);
    }
    printf("%d",ans);
    return 0;
}
时间: 2024-10-21 03:25:27

【poj2187】最远点对(勉强凑数)的相关文章

[POJ2187][BZOJ1069]旋转卡壳

旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同样的方向旋转 所以在枚举其中一条边的过程中完全没有必要重新枚举另一条边 而且对于一条边而言,凸包上的点到这条边的距离是满足单峰性质的 所以线性的做法就出来啦 ↓代码非常短很优秀~ procedure Roatating_Calipers; begin stack[len+1]:=stack[1];j

时间会证明一切

~笑而不言,痛而不语~ 穿别人的鞋,走一里路西方有句谚语:不要抱怨别人的路好走,知道你穿上他的鞋子走一里路.怜悯他人,即是怜悯未知的自己.也许有一天,你即是他,他即是你. 可以任性,但要领情多妙的一句“人生贵在任性而领情”,换种简单说法便是:活出自我,感恩生活.但凡这样的生命,都配得上君子二字.既不曾泯灭梦想,又不轻慢沿途各色风光.谢君曾相邀,行此阳关道.如今走的自如,却不代表阳关道不好.道一个谢字是理所应当礼貌.活过这一遭,须兼备坚持与修养,才不枉当初选了那一座任性又精彩的独木桥. 是个人就饱

仅需七步,帮你找出最具盈利能力的商业模式!

本文作者开办线上课堂,教大家如何在网上赚钱开辟出属于自己的事业.他给课程的定价最低为 5000 美金,最高是 2 万 5 千美金(取决于不同的课程类型).2015 年的利润已经超过了 150 万美金. 他给大家了 7 个步骤,借此能够在你的产品服务中找出最具盈利能力的商业模式是什么,其内容包括了如何定价,如何找出最具利润贡献值的客户人群,如何对产品进行定位等等多个内容. 当有了一个解决方案,能够为正确的客户解决最具「痛点」的问题,那么这个客户就会很愿意为你付钱,情况好的话,会愿意付很多的钱. 不

poj2187 求平面最远点对,garham_scan算法求凸包

poj2187 求平面最远点对,garham_scan算法求凸包 Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 29666   Accepted: 9180 Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, earning the title 'M

你住的离公司有多远,就离上位有多远

二白职话 百家号17-07-1515:38 图片源自网络 文|张二白很白 上班距离的远近并不能就完全决定你职场的晋升空间,但它给你提供的是一段可自由支配的时间,和每天更加从容淡定的开始. 1. 周日下午刚搬完家,收拾到凌晨两点多钟,才让新家勉强可以入住. 这是来北京7年后的第5次搬家,倒不是因为工作的变动,主要是公司这几年发展太快,每隔两年就得换个更大的地方办公,而我也只能是跟着公司变换着家的位置. 小时候家里找算命的给算过,说我们一家子会越搬越发,现在想想,发财倒还算不上,但环境条件肯定是越搬

linux vncserver 远控

在Linux上启动VNC Server(如果没安装的话那就先安装) 执行vncserver命令: [[email protected] root]# vncserver You will require a password to access your desktops. Password: ----为了不想任何人都可以任意遥控此计算机.因此当第 Verify: ---1次启动VNC server时,会要求设置网络遥控的密码. 这样后就设置了密码,再运行vncserver 记住这个1,下面会用

你相信吗:无线供电其实离我们已经不远了

无线供电是一种方便安全的新技术,无需任何物理上的连接,电能就可以近距离无接触地传输给负载.虽然直到现在无线供电在许多人眼里还是一个新兴事物,但是早在一百多年前就有科学家注意到这项技术了.而且更让人惊喜和难以置信的是无线供电离我们已经不远了. 电感耦合无线充电 最常见的无线充电方式是使用电感耦合(通常是一个特定的子集称为"谐振电感耦合")技术.这种状态的电流变化是根据法拉第电磁感应定律产生感应电动势,如果你有一个电动牙刷.电动剃须刀或助听器,当你把它们插向插座时,你就见证了电感耦合的发生

我们离人工智能有多远?

自从人工智能被提出之日起,已经过去了半个世纪,至今也没有达到人们期待的水准.也许,真正的人工智能永远也不会实现. 最近在研究图像检索时突然想到这个问题,在这里写下一些自己的思考. 人们最终所期望实现的人工智能应该是与人类具有一样的智慧或者超越人类的智慧,我们可以称之为智慧生命.但是智慧生命真的能够实现吗? 人工智能学科大致分为两派,一派是推理派,另一派是学习派. 推理派认为智慧生命应该像人一样能够进行推理,所以我们应该对计算机设计一套推理的程序,以此来实现智慧生命.但是人类在一些事情的处理上难道

20145225唐振远《网络对抗》 Web安全基础实践

20145225唐振远<网络对抗>Web安全基础实践 参考博客:20145215 卢肖明 基础问题回答 (1)SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的. 防御:利用输入规则限制进行防御,过滤输入的数据,不允许特殊字符输入. (2)XSS攻击的原理,如何防御? 跨站脚本攻击,允许恶意用户将恶意Script代码注入到网页上,当用户浏览网页时,嵌入其中Web里面的Script代码