题目链接

 /*
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. 在eclipse中构建solr项目+添加core+整合mysql+添加中文分词器

    最近在研究solr,这里只记录一下eclipse中构建solr项目,添加core,整合mysql,添加中文分词器的过程. 版本信息:solr版本6.2.0+tomcat8+jdk1.8 推荐阅读:so ...

  2. 【深度学习】使用opencv在视频上添加文字和标记框

    深度学习识别出视频的物体之后,需要在视频上画框标记出来. 接下来介绍如何使用python在视频上画框和文字 #!/usr/bin/env python # -*- coding:utf-8 -*- i ...

  3. pandas(零)数据结构

    pandas的两个主要的数据结构: Series series是一种类似于一维数组的对象,它由一组数据(NumPy数组类型的数据)和一组与之相关的数据标签(索引)组成. from pandas imp ...

  4. C#加快Bitmap的访问速度

    在对Bitmap图片操作的时候,有时需要用到获取或设置像素颜色方法:GetPixel 和 SetPixel, 如果直接对这两个方法进行操作的话速度很慢,这里我们可以通过把数据提取出来操作,然后操作完在 ...

  5. C语言运算符优先级误解

    优先级问题 表达式 可能误以为的结果 实际结果 .的优先级高于*. ->操作符用于消除这个问题 *p.f p所指对象的字段f. (*p).f 对p去f偏移,作为指针,然后进行解除引用操作. *( ...

  6. Js onload 解析

    Js onload的使用方法. 1.在script中调用 window.onload = function(){ function1(); function2(); function3(); }; 或 ...

  7. c# 抽象类(abstract)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; //抽象类(abstract ...

  8. HTML系列(2)基本的HTML标签(一)

        本节介绍基本的HTML标签的使用实例.     (1)h标签: <!DOCTYPE html> <html> <head> <title>示例2 ...

  9. php分类树

    class Category{ public $sonName; public $parentName; public function __consturt($id,$parent_id){ $th ...

  10. Linux Shell编程 sed命令

    概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...