题目链接

 /*
Name:nyoj-253-LK的旅行
Copyright:
Author:
Date: 2018/4/27 15:01:36
Description:
zyj的模板
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = ;
struct Point
{
int x, y;
Point(int _x = , int _y = )
{
x = _x;
y = _y;
}
Point operator - (const Point &b)const
{
return Point(x - b.x, y - b.y);
}
int operator ^(const Point &b)const
{
return x * b.y - y * b.x;
}
int operator *(const Point &b)const
{
return x * b.x + y * b.y;
}
void input()
{
scanf("%d%d", &x, &y);
return ;
}
};
// 距离的平方
int dist2(Point a, Point b)
{
return (a - b) * (a - b);
} // 二维凸包
Point list[MAXN];
int Stack[MAXN], top;
bool _cmp(Point p1, Point p2)
{
int tmp = (p1 - list[]) ^ (p2 - list[]);
if (tmp > )
{
return true;
}
else if (tmp == && dist2(p1, list[]) <= dist2(p2, list[]))
{
return true;
}
else
{
return false;
}
}
void Graham(int n)
{
Point p0;
int k = ;
p0 = list[];
for (int i = ; i < n; i++)
{
if (p0.y > list[i].y || (p0.y == list[i].y && p0.x > list[i].x))
{
p0 = list[i];
k = i;
}
}
swap(list[k], list[]);
sort(list + , list + n, _cmp);
if (n == )
{
top = ;
Stack[] = ;
return ;
}
if (n == )
{
top = ;
Stack[] = ;
Stack[] = ;
return ;
}
Stack[] = ;
Stack[] = ;
top = ;
for (int i = ; i < n; i++)
{
while (top > && ((list[Stack[top - ]] - list[Stack[top - ]]) ^ (list[i] - list[Stack[top - ]])) <= )
{
top--;
}
Stack[top++] = i;
}
return ;
}
// 旋转卡壳,求两点间距离平方的最大值
int rotating_calipers(Point p[],int n)
{
int ans = ;
Point v;
int cur = ;
for (int i = ; i < n; i++)
{
v = p[i] - p[(i + ) % n];
while ((v ^ (p[(cur + ) % n] - p[cur])) < )
{
cur = (cur + ) % n;
}
ans = max(ans, max(dist2(p[i], p[cur]), dist2(p[(i + ) % n], p[(cur + ) % n])));
}
return ans;
}
Point p[MAXN];
int main()
{
int n;
cin>>n;
while (n--)
{
int m;
cin>>m;
for (int i = ; i < m; i++)
{
list[i].input();
}
Graham(m);
for (int i = ; i < top; i++)
{
p[i] = list[Stack[i]];
}
printf("%d\n", rotating_calipers(p, top));
}
return ;
}

nyoj-253-LK的旅行(Graham算法和旋转卡壳)的更多相关文章

  1. nyoj 253:LK的旅行 【旋转卡壳入门】

    题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...

  2. Graham算法—二维点集VC++实现

    一.凸包定义 通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包. 二.Graham算法思想 概要:Graham算法的主要思想就是,最终形成的凸包,即包围所有点的凸 ...

  3. 平面凸包Graham算法

    板题hdu1348Wall 平面凸包问题是计算几何中的一个经典问题 具体就是给出平面上的多个点,求一个最小的凸多边形,使得其包含所有的点 具体形象就类似平面上有若干柱子,一个人用绳子从外围将其紧紧缠绕 ...

  4. nyoj_253:LK的旅行(旋转卡壳入门)

    题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...

  5. poj 2187 凸包加旋转卡壳算法

    题目链接:http://poj.org/problem?id=2187 旋转卡壳算法:http://www.cppblog.com/staryjy/archive/2009/11/19/101412. ...

  6. LA 4728 旋转卡壳算法求凸包的最大直径

    #include<iostream> #include<cstdio> #include<cmath> #include<vector> #includ ...

  7. POJ2187 Beauty Contest (旋转卡壳算法 求直径)

    POJ2187 旋转卡壳算法如图 证明:对于直径AB 必然有某一时刻 A和B同时被卡住 所以旋转卡壳卡住的点集中必然存在直径 而卡壳过程显然是O(n)的 故可在O(n)时间内求出直径 凸包具有良好的性 ...

  8. POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法 + 运算符重载

    水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较 ...

  9. NYOJ 737---石子归并(GarsiaWachs算法)

    原题链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求 ...

随机推荐

  1. springboot整合 Thymeleaf模板

    首先引入maven jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  2. 3.2 使用STC89C52控制MC20发送短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  3. time函数计算时间

    学过C语言的都知道有个time函数可以计算时间, 也好像知道time(NULL)返回的是一个距离1970年1月1日0时0分0秒的秒数. #include <stdio.h> #includ ...

  4. OpenGL学习进程(5)第三课:视口与裁剪区域

    本节是OpenGL学习的第三个课时,下面介绍如何运用显示窗体的视口和裁剪区域:     (1)知识点引入:     1)问题现象: 当在窗体中绘制图形后,拉伸窗体图形形状会发生变化: #include ...

  5. centos6 没有eth0网络

    编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 ONREBOOT=no #改成yes service network restart 在用 ifconfig ...

  6. 【leetcode刷题笔记】Median of Two Sorted Arrays

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  7. RTC是DS1339,驱动采用的是rtc-ds1307.c

    我的外部RTC是DS1339,驱动采用的是rtc-ds1307.c在内核里选上了 <*> I2C support 以及 [*]   Set system time from RTC on  ...

  8. tcp/ip 中的分组和分片

    osi 大家应该都知道osi七层模型吧,物理层 链路层 网络层 传输层 会话层 表示层 应用层ip 属于网络层,tcp 属于传输层,你可以把每一层想像成粽子的粽叶,包裹了七层的粽子最外面的就是物理层, ...

  9. CSS3 3D发光切换按钮

    在线演示 本地下载

  10. QGIS 编译

    QGIS 编译 在编译的过程中花费了很长时间,特别是编译Debug版本.release版本的编译可以从晚上找到很多的资料,但是Debug的编译相对较少.在Debug编译的过程中,需要单独build工程 ...