Min-Max
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 2192   Accepted: 502

Description

Define the following function




Given the value C of F(p1, p2 ... pn), can you find the minimum and maximum value of F(q1, q2 ... qn)?

Input

The input contains several test cases. For each test case, it contains three lines.



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

For each test case, output the minimum and maximum value in a single line with the fraction rounded to 3 decimal places.

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(凸包)的更多相关文章

  1. [poj1113][Wall] (水平序+graham算法 求凸包)

    Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...

  2. ZOJ 3871 Convex Hull(计算几何、凸包)

    题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...

  3. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  4. UVA 11168 Airport(凸包+直线方程)

    题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然 ...

  5. 关于2016.12.12——T1的反思:凸包的意义与应用

    2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...

  6. poj1228--稳定凸包

    题目大意:给你一个凸包上的某些点(可能在凸包内),询问是否能确定这个凸包. 思路:先求出题目给出的点的凸包,看看在凸包的每条边内(不包括端点)有没有点,若有,则这条边是确定的,若没有,则这条边不确定, ...

  7. POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

    题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...

  8. HDU 4946 Area of Mushroom(构造凸包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...

  9. HDU 1392 凸包模板题,求凸包周长

    1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...

随机推荐

  1. 在oracle中怎么通过字段名查询其所在的表

    ora = //连接描述符名:ora (description = //描述 (address = //网络地址之一 (protocol = tcp) //网络协议(tcp表示TCP/IP协议) (h ...

  2. f-Strings:一种改进Python格式字符串的新方法

    好消息是,F字符串在这里可以节省很多的时间.他们确实使格式化更容易.他们自Python 3.6开始加入标准库.您可以在PEP 498中阅读所有内容. 也称为“格式化字符串文字”,F字符串是开头有一个f ...

  3. Leetcode 334.递增的三元子序列

    递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n- ...

  4. pat 1029 1029. 旧键盘(20)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际 ...

  5. 【Luogu】P3628特别行动队(斜率优化DP)

    题目链接 设c[i]是战斗力前缀和,f[i]是考虑前i个,且最后一组分到第i个士兵为止的战斗力之和 则有朴素状态转移方程 ;i<=n;++i) ;j<i;++j){ int x=c[i]- ...

  6. [luoguP2324] [SCOI2005]骑士精神(A*?)

    传送门 蒟蒻并不懂A*是什么,但是题解里有个Astar 可以看出,当前棋盘和最终的棋盘如果有k个不同的,那么至少需要k-1步来移动 所以如果 当前步数 + k - 1 > limit 就直接退出 ...

  7. 【leetcode】lower_bound

    int binary_search(const vector<int>& stones,int val){ int sz=stones.size(); ,r=sz-; while( ...

  8. OsCache MemCached EhCache

    Memcache:分布式内存对象缓存系统,占用其他机子的内存.很多互联网,负载均衡三台(以三台为例)web服务器可以共享一台Memcache的资源.传递的信息以键值对的形式存储.传递的数据要实现序列化 ...

  9. eq=等于gt=大于lt=小于的英文全称

    EQ: Equal GT: Greater Than LT: Less than 知道全称就不会忘记

  10. python结构语句(while,if)

    一.基础语法 编码: 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串 #!/usr/bin/env python # -*- coding:utf- ...