SGU 332 Largest Circle(凸包内接圆半径nlogn)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=332
题意:逆时针给出一个凸包,给凸包的最大内接圆半径。
思路:nlogn的算法:
(1)二分内切圆半径的值R
(2)把每个半平面向内平移R的长度
(3)使用一个双端队列(deque),依次向首部加入hplane[0],hplane[1],
for(i=2;i<num_hplane;i++)
{
while(deque顶端的两个半平面的交点在hplane[i]外) 删除deque顶端
while(deque底部的两个半平面的交点在hplane[i]外) 删除deque底部
将hplane[i]加入deque顶端
}
while(deque顶端的两个半平面的交点在底部半平面外) 删除deque顶端
while(deque底部的两个半平面的交点在顶端半平面外) 删除deque底部
判断最后剩下的半平面是否在3个以上
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #include <stack> #include <string> #include <map>#define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define abs(x) ((x)>=0?(x):-(x)) #define i64 long long #define u32 unsigned int #define u64 unsigned long long #define clr(x,y) memset(x,y,sizeof(x)) #define CLR(x) x.clear() #define ph(x) push(x) #define pb(x) push_back(x) #define Len(x) x.length() #define SZ(x) x.size() #define PI acos(-1.0) #define sqr(x) ((x)*(x)) #define MP(x,y) make_pair(x,y) #define EPS 1e-5#define FOR0(i,x) for(i=0;i<x;i++) #define FOR1(i,x) for(i=1;i<=x;i++) #define FOR(i,a,b) for(i=a;i<=b;i++) #define DOW0(i,x) for(i=x;i>=0;i--) #define DOW1(i,x) for(i=x;i>=1;i--) #define DOW(i,a,b) for(i=a;i>=b;i--) using namespace std;void RD(int &x){scanf("%d",&x);} void RD(i64 &x){scanf("%I64d",&x);} void RD(u32 &x){scanf("%u",&x);} void RD(double &x){scanf("%lf",&x);} void RD(int &x,int &y){scanf("%d%d",&x,&y);} void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);} void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);} void RD(double &x,double &y){scanf("%lf%lf",&x,&y);} void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);} void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);} void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);} void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);} void RD(char &x){x=getchar();} void RD(char *s){scanf("%s",s);} void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);} void PR(i64 x) {printf("%I64d\n",x);} void PR(u32 x) {printf("%u\n",x);} void PR(double x) {printf("%.6lf\n",x);} void PR(char x) {printf("%c\n",x);} void PR(char *x) {printf("%s\n",x);} void PR(string x) {cout<<x<<endl;}const int N=10005;int DB(double x) {if(x>EPS) return 1;if(x<-EPS) return -1;return 0; }class point { public:double x,y;point(){}point(double _x,double _y){x=_x;y=_y;}point operator+(point a){return point(x+a.x,y+a.y);}point operator-(point a){return point(x-a.x,y-a.y);}double operator*(point a){return x*a.y-y*a.x;}point operator*(double t){return point(x*t,y*t);}double operator^(point a){return x*a.x+y*a.y;}point operator/(double t){return point(x/t,y/t);}double getLen(){return sqrt(x*x+y*y);}void get(){RD(x,y);}int operator==(point a){return DB(x-a.x)==0&&DB(y-a.y)==0;}int operator<(point a){if(DB(x-a.x)) return x<a.x;return y<a.y;}point adjust(double L){double temp=getLen();return point(x*L/temp,y*L/temp);}void print(){printf("%.6lf %.6lf\n",x,y);} };class Vector { public:point s,t;double ang;Vector(){}Vector(point _s,point _t){s=_s;t=_t;ang=atan2(t.y-s.y,t.x-s.x);}};Vector a[N],b[N],st[N]; point p[N]; int n;double cross(point a,point b,point p) {return (b-a)*(p-a); }int in(point p,Vector a) {return cross(a.s,a.t,p)>0; }point getCross(Vector a,Vector b) {double s1=(a.s-b.s)*(a.t-b.s);double s2=(a.t-b.t)*(a.s-b.t);return (b.s*s2+b.t*s1)/(s1+s2); }Vector move(Vector a,double L) {point d=point(a.s.y-a.t.y,a.t.x-a.s.x);d=d.adjust(L);return Vector(a.s+d,a.t+d); }int cmp(Vector a,Vector b) {return a.ang<b.ang; }int OK(double L) {int i;FOR1(i,n) b[i]=move(a[i],L);int head=1,tail=1;st[1]=b[1];for(i=2;i<=n;i++){while(tail>head&&!in(getCross(st[tail-1],st[tail]),b[i])) tail--;while(tail>head&&!in(getCross(st[head],st[head+1]),b[i])) head++;st[++tail]=b[i];}while(tail>head&&!in(getCross(st[tail],st[tail-1]),st[head])) tail--;while(tail>head&&!in(getCross(st[head],st[head+1]),st[tail])) head++;return tail>head+1; }int main() {RD(n);int i;FOR1(i,n) p[i].get();p[0]=p[n];FOR1(i,n) a[i]=Vector(p[i-1],p[i]);double low=0,high=1e8,mid;while(DB(low-high)==-1){mid=(low+high)/2;if(OK(mid)) low=mid;else high=mid;}PR(mid);return 0; }
SGU 332 Largest Circle(凸包内接圆半径nlogn)相关推荐
- opencv 最大内接矩形_OpenCV之二值图像分析 – 寻找最大内接圆
python代码: from __future__ import print_function from __future__ import division import cv2 as cv imp ...
- 375 Inscribed Circles and Isosceles Triangles 等腰三角形 内接圆 圆周率PI表示
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVa 375 内接圆和等腰三角形
/* * 解题思路: * 题意不难理解.一直求内接圆半径.知道半径长度小于0.000001为止 */ #include <math.h> #include <stdio.h> ...
- 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
- 习题:编程求圆周长、圆面积、圆球体积、设圆半径r=1.5。要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位...
1 /*编程求圆周长.圆面积.圆球体积.设圆半径r=1.5.要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位*/ 2 /*圆球体积公式 V=(4*π*r3)/3 */ 3 ...
- 输入圆半径,求圆面积并保留两位小数
import java.util.*; //调用util包中的所有类 public class Circle //定义一个Circle类 {public static void main(String ...
- 百度地图画圆:动态绘制显示圆半径
百度地图画圆:动态绘制显示圆半径 在开发百度地图时,项目需要借助画圆工具框选地图上的点,原始画圆工具可以通过 enableCalculate() 方法获取框选区域面积,进而可以计算圆的半径. ...
- PTA java 异常:圆半径不能为负数
这是函数题模板.这里写题目要求.计算圆的面积,其中PAI取3.14,圆半径为负数时应抛出异常,输出相应提示. 函数接口定义: 裁判测试程序样例: 在这里给出函数被调用进行测试的例子.例如: impor ...
- C语言学习之有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1
有4个圆塔,圆心分别为(2,2).(-2,2).(-2,-2).(2,-2),圆半径为1,这4个塔的高度为10m,塔以外无建筑物.今输入任一点的坐标,求该点的建筑高度(塔外的高度为零). #inclu ...
最新文章
- 添加墙元素实现碰撞效果
- 质数,约数(数论) AcWing算法课
- u-boot移植第四弹——2013.10u-boot增加dm9000的支持
- NFS搭建openfoam
- 【PM】当大厂来临时,求生?求胜?
- 终极Java日志字典:开发人员最常记录的单词是什么?
- 《Python Cookbook 3rd》笔记(1.18):映射名称到序列元素
- file 创建 txt文件
- Window系统下 MongoDB 下载 和 安装
- 使用emacs + cscope + ecb替代source insight
- 计算机的管理选项文件错误,如何修复Microsoft Teams错误文件在Windows PC中被锁定...
- 通信原理 简易AMI码与HDB3码编码方式比较的matlab实现
- 【matlab】 GMSK的调制与解调【附详尽注释】
- 三星内存编码_想问一下三星内存条的型号有什么区别
- excel 置信区间 计算_正态分布 excle(Excel中用什么函数可以算置信区间,怎么算啊?)...
- C++多态的职工管理系统
- 【产业互联网周报】微盟称数据已全面找回,公布商家赔付计划;疫情影响全球展会:Facebook取消年度F8开发者大会...
- 视频格式转换器哪个好?怎样使用?
- 两个long型数据相除结果错误问题解决
- STM32学习记录--关于按键配置(PB3 PB4)
热门文章
- HDU1899 Sum the K-th's(树状数组)
- cactiez----监控windows主机 server 2008 r2
- linux 自动提权perl脚本
- Android常用控件之Fragment仿Android4.0设置界面
- Spring中加载xml配置文件的六种方式
- 注意:你智能机中的流氓APP
- Apache发布Groovy 2.5正式版及3.0预览版
- Eclipse 代码自动提示的设置
- InputStreamReader/OutputStreamWriter乱码问题解决
- PHP 通过fsockopen函数获取远程网页源码