poj2595(凸包)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2192 | Accepted: 502 |
Description

Given the value C of F(p1, p2 ... pn), can you find the minimum and maximum value of F(q1, q2 ... qn)?
Input
Line 1: two integers n (1<= n <= 50000) and C.
Line 2: n integers p1, p2 ... pn (|pi| < 1000 for 1 <= i <= n).
Line 3: n integers q1, q2 ... qn (|qi| < 1000 for 1 <= i <= n).
Output
Sample Input
- 2 1
- 3 1
- 0 2
Sample Output
- 2.000 2.000
Source
题目一看就很熟悉很熟悉很熟悉啊!
我怎么一眼看到就想起詹森不等式呢。
。。。
事实上是重心公式。C是重心的x,而y在凸包上。
所以问题就变成求凸包啦!
求完凸包就要绕着凸包上每一条边求极值并更新。
- /***********************************************************
- > OS : Linux 3.13.0-24-generic (Mint-17)
- > Author : yaolong
- > Mail : dengyaolong@yeah.net
- > Time : 2014年10月14日 星期二 07时44分53秒
- **********************************************************/
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const double INF = 1e50;
- const int N = 61111;
- struct Point
- {
- int x, y;
- } ;
- Point p[N], stk[N];
- Point minp;
- int top;
- double cross ( Point &o, Point &a, Point &b )
- {
- return ( a.x - o.x ) * ( b.y - o.y ) - ( a.y - o.y ) * ( b.x - o.x );
- }
- double dist ( Point &A, Point & B )
- {
- return hypot ( A.x - B.x, A.y - B.y );
- }
- bool cmp ( Point A, Point B )
- {
- double k = cross ( minp, A, B );
- if ( k < 0 ) return 0;
- if ( k > 0 ) return 1;
- return dist ( minp, A ) < dist ( minp, B );
- }
- void Gramham ( int n )
- {
- int i;
- for ( i = 1; i < n; i++ )
- {
- if ( p[i].y < p[0].y || ( p[i].y == p[0].y && p[i].x < p[0].x ) )
- {
- swap ( p[i], p[0] );
- }
- }
- minp = p[0];
- p[n] = p[0];
- sort ( p + 1, p + n, cmp );
- stk[0] = p[0];
- stk[1] = p[1];
- top = 1;
- for ( i = 2; i < n; i++ )
- {
- while ( top >= 1 && cross ( stk[top - 1], stk[top ], p[i] ) <= 0 ) --top;
- stk[++top] = p[i];
- }
- }
- double mmin, mmax;
- int c;
- void update ( Point a, Point b )
- {
- if ( a.x > b.x )
- {
- swap ( a, b );
- }
- if ( a.x <= c && b.x >= c )
- {
- if ( a.x == c && b.x == c )
- {
- mmax = max ( mmax, ( double ) max ( a.y, b.y ) );
- mmin = min ( mmin, ( double ) min ( a.y, b.y ) );
- }
- else
- {
- double k = ( ( double ) c - a.x ) / ( ( double ) b.x - a.x ) * ( b.y - a.y ) + a.y;
- mmax = max ( mmax, k );
- mmin = min ( mmin, k );
- }
- }
- }
- int main()
- {
- int n, i;
- while ( ~scanf ( "%d%d", &n, &c ) )
- {
- for ( i = 0; i < n; i++ )
- {
- scanf ( "%d", &p[i].x );
- }
- for ( i = 0; i < n; i++ )
- {
- scanf ( "%d", &p[i].y );
- }
- if ( n == 1 )
- {
- printf ( "%.3f %.3f\n", ( double ) p[0].y, ( double ) p[0].y );
- continue;
- }
- Gramham ( n );
- stk[++top] = stk[0];
- mmin = INF, mmax = -INF;
- for ( i = 1; i <= top; i++ )
- {
- update ( stk[i - 1], stk[i] );
- }
- printf ( "%.3f %.3f\n", mmin, mmax );
- }
- return 0;
- }
poj2595(凸包)的更多相关文章
- [poj1113][Wall] (水平序+graham算法 求凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- ZOJ 3871 Convex Hull(计算几何、凸包)
题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...
- UVALive 2453 Wall (凸包)
题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...
- UVA 11168 Airport(凸包+直线方程)
题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然 ...
- 关于2016.12.12——T1的反思:凸包的意义与应用
2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...
- poj1228--稳定凸包
题目大意:给你一个凸包上的某些点(可能在凸包内),询问是否能确定这个凸包. 思路:先求出题目给出的点的凸包,看看在凸包的每条边内(不包括端点)有没有点,若有,则这条边是确定的,若没有,则这条边不确定, ...
- POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- HDU 1392 凸包模板题,求凸包周长
1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...
随机推荐
- es6--之箭头函数
「箭头函数」是 ECMAScript6 中非常重要的性特性.很多文章都在描述它的上下文透明性以及短语法.新特性必然会带来很多好处,但凡事都有两面性.本篇文章会通过情景引导,让你知晓哪些情景下应该绕过箭 ...
- Linux基础命令详解-2
本篇详解的命令有以下30个 1.rmdir 功能:删除一个空目录 2.telnet 功能:使用telnet协议连接到主机的指定端口 3.vim 功能:编辑器之神 vim三种模式的功能及其转换 ...
- Consecutive Subsequence (DP+map)
You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...
- 【Kubernetes】深入解析声明式API
在Kubernetes中,一个API对象在Etcd里的完整资源路径,是由:Group(API组).Version(API版本)和Resource(API资源类型)三个部分组成的. 通过这样的结构,整个 ...
- Python logging 学习
基本用法: import logging #初始化logger 对象 logger = logging.getLogger("main") #设置logger对象基础级别,后面的h ...
- 【Luogu】P1941飞扬的小鸟(DP)
我发现现在没了题解我做普及提高+的题也做不了 更不要说这些提高+难度的题 此题是一个二维DP.暴力是三重循环ijk,k枚举在i位置上的点击次数.即 for(int i=1;i<=n;++i) ...
- 转:C++ Vector用法深入剖析
http://developer.51cto.com/art/201002/183645.htm C++编程语言中有一种叫做Vector的应用方法,它的作用在实际编程中是非常重要的.在这里我们将会为大 ...
- Sql Server 中的 @@ERROR
@@ERROR:当前一个语句遇到错误,则返回错误号,否则返回0.需要注意的是@ERROR在每一条语句执行后会被立刻重置,因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用. D ...
- Java面试题集(一)
作为一名java开发软件工程,一定要记住,基础非常重要,往往就是一些基础,很简单,但是你就是不知道实现原理,为什么使用,有没有自己去发现,对比,差异从而总结,有些东西看似简单,但是不一定你描述清楚,直 ...
- yii 之增加数据
模型代码: <?php namespace app\models; use yii\db\ActiveRecord; class Test extends ActiveRecord{ publi ...