nyoj-253-LK的旅行(Graham算法和旋转卡壳)
/*
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算法和旋转卡壳)的更多相关文章
- nyoj 253:LK的旅行 【旋转卡壳入门】
题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...
- Graham算法—二维点集VC++实现
一.凸包定义 通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包. 二.Graham算法思想 概要:Graham算法的主要思想就是,最终形成的凸包,即包围所有点的凸 ...
- 平面凸包Graham算法
板题hdu1348Wall 平面凸包问题是计算几何中的一个经典问题 具体就是给出平面上的多个点,求一个最小的凸多边形,使得其包含所有的点 具体形象就类似平面上有若干柱子,一个人用绳子从外围将其紧紧缠绕 ...
- nyoj_253:LK的旅行(旋转卡壳入门)
题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...
- poj 2187 凸包加旋转卡壳算法
题目链接:http://poj.org/problem?id=2187 旋转卡壳算法:http://www.cppblog.com/staryjy/archive/2009/11/19/101412. ...
- LA 4728 旋转卡壳算法求凸包的最大直径
#include<iostream> #include<cstdio> #include<cmath> #include<vector> #includ ...
- POJ2187 Beauty Contest (旋转卡壳算法 求直径)
POJ2187 旋转卡壳算法如图 证明:对于直径AB 必然有某一时刻 A和B同时被卡住 所以旋转卡壳卡住的点集中必然存在直径 而卡壳过程显然是O(n)的 故可在O(n)时间内求出直径 凸包具有良好的性 ...
- POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法 + 运算符重载
水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较 ...
- NYOJ 737---石子归并(GarsiaWachs算法)
原题链接 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求 ...
随机推荐
- MySQL basics
@1: MySQL有三大类数据类型, 分别为数字.日期\时间.字符串, 这三大类中又更细致的划分了许多子类型: 数字类型 整数: tinyint.smallint.mediumint.int.bigi ...
- [转+整理]linux shell 将字符串分割成数组
原文链接:http://1985wanggang.blog.163.com/blog/static/776383320121745626320/ a="one,two,three,four& ...
- github代码托管
下载github客户端软件 1) 官网下载help.github.com 2) 百度搜索,一般用于windows7以前的系统 安装github软件 按照软件提示安装即可.不过,博主倾向使用命令行工 ...
- Python操作——Redi
redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(列表).hash(哈希).set(集合).zset(有 ...
- Incomplete response received from application
RAILS_ENV=production rake secret 将输出的一大串字码粘贴到rails工程中/config/secrets.yml去,替换掉该文件中的<%= ENV["S ...
- $《第一行代码:Android》读书笔记——第10章 Android网络编程
(一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...
- PHP操作MongoDB数据库的示例
http://www.jquerycn.cn/a_8137 本节内容:PHP操作MongoDB数据库的简单示例. Mongodb的常用操作参看手册,php官方的http://us2.php.net/m ...
- Linux基础四---系统监控&硬盘分区
---恢复内容开始--- 一系统分区 1.top [参数] -b 批处理 -c 显示命令完全模式 -I 忽略失效过程 -s 保密模式 -S 累积模式 -i<时间> 设置间隔时间 -u< ...
- vue引入bootstrap.min.css报错:Cannot find module "./assets/css/bootstrap.min.css"
问题如下图: 明明文件就在那里,就是报错说找不到模板,然后我就用了网上的方法,重新建立了一个项目,请参考如下: http://blog.csdn.net/ansu2009/article/detail ...
- Spark常用算子-KeyValue数据类型的算子
package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...