HDU6219/POJ1259 [ICPC2017沈阳]Empty Convex Polygons 最大空凸包

Empty Convex Polygons

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 538    Accepted Submission(s): 138

Problem Description

Given a set of distinct points S on a plane, we define a convex hole to be a convex polygon having any of thegiven points as vertices and not containing any of the given points in its interior. In addition to the vertices, other given points may lie on the perimeter of the polygon. We want to find a convex hole as above forming the convexpolygon with the largest area.

Input

This problem has several test cases.
The first line of input contains an integer t (1 ≤ t ≤ 100) indicating the total number of cases. For each test case,the first line contains the integer n (3 ≤ n ≤ 50). Each of the following n lines describes a point with two integers x and y where -1000 ≤ x, y ≤ 1000.
We guarantee that there exists at least one non-degenerated convex polygon.

Output

For each test case, output the largest area of empty convex polygon, with the precision of 1 digit.
Remark: The corollary of Pick’s theorem about the polygon with integer coordinates in that says the area of it iseither ends to .0 or .5.

Sample Input

4
3
0 0
1 0
0 1
5
0 0
1 0
2 0
0 1
1 1
5
0 0
3 0
4 1
3 5
-1 3
6
3 1
1 0
2 0
3 0
4 0
5 0

Sample Output

0.5
1.5
17.0
2.0

求一个裸的最大空凸包,计算几何+DP真的要命...

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=100;
const double zero=1e-8;
struct Vector
{
 double x,y;
};

inline Vector operator -(Vector a,Vector b)
{
    Vector c;
    c.x=a.x-b.x;
    c.y=a.y-b.y;
    return c;
}

inline double sqr(double a)
{
 return a*a;
}

inline int Sign(double a)
{
 if(fabs(a)<=zero)return 0;
 return a<0 ? -1:1;
}

inline bool operator <(Vector a,Vector b)
{
 return Sign(b.y-a.y)>0||Sign(b.y-a.y)==0&&Sign(b.x-a.x)>0;

}

inline double Max(double a,double b)
{
 return a>b ? a:b;
}

inline double Length(Vector a)
{
 return sqrt(sqr(a.x)+sqr(a.y));
}

inline double Cross(Vector a,Vector b)
{
 return a.x*b.y-a.y*b.x;
}

Vector dot[maxn],List[maxn];
double opt[maxn][maxn];
int seq[maxn];
int n,len;
double ans;

bool Compare(Vector a,Vector b)
{
 int temp=Sign(Cross(a,b));
 if (temp!=0)return temp>0;
 temp=Sign(Length(b)-Length(a));
 return temp>0;
}

void Solve(int vv)
{
 int t,i,j,_len;
 for(int ii=len=0;ii<n;ii++)
    {
     if(dot[vv]<dot[ii])List[len++]=dot[ii]-dot[vv];
    }
 for(i=0;i<len;i++)
    for(j=0;j<len;j++)
        opt[i][j]=0;
 sort(List,List+len,Compare);
 double v;
 for(t=1;t<len;t++)
    {
     _len=0;
     for(i=t-1;i>=0&&Sign(Cross(List[t],List[i]))==0;i--);
     //cout<<i<<endl;
     while(i>=0)
        {
         v=Cross(List[i],List[t])/2.;
         seq[_len++]=i;
         for(j=i-1;j>=0&&Sign(Cross(List[i]-List[t],List[j]-List[t]))>0;j--);
         if(j>=0)v+=opt[i][j];
         ans=Max(ans,v);
         opt[t][i]=v;
         i=j;
        }
     for(i=_len-2;i>=0;i--)
        opt[t][seq[i]]=Max(opt[t][seq[i]],opt[t][seq[i+1]]);
    }
}

int i;
double Empty()
{
 ans=0;
 for(i=0;i<n;i++)
    Solve(i);
 return ans;
}
int main()
{//freopen("t.txt","r",stdin);
 int T;
 scanf("%d",&T);
 while(T--)
    {
     scanf("%d",&n);
     for(int i=0;i<n;i++)
        scanf("%lf%lf",&dot[i].x,&dot[i].y);
     printf("%.1lf\n",Empty());
    }
 return 0;
}

原文地址:https://www.cnblogs.com/mizersy/p/9524324.html

时间: 2024-10-14 10:10:18

HDU6219/POJ1259 [ICPC2017沈阳]Empty Convex Polygons 最大空凸包的相关文章

O(n^3)求最大空凸包模板(2017沈阳icpc-C Empty Convex Polygons )

题目链接:https://vjudge.net/contest/358714#problem/C 题意:求最大空凸包的面积,点的个数n<=50. 思路: 参考链接:https://blog.csdn.net/cdsszjj/article/details/79366813 计算几何+DP. 首先枚举凸包最左下角的点O,忽略O下面的点,对其它点进行极角排序. 然后枚举凸包上的最后一个点i,用dp[i][j]表示以三角形Oij为凸包的最后一块三角形的最大空凸包的面积.那么可以得到转移方程: dp[i

hdu 6219 Empty Convex Polygons

- -先mark了 http://blog.csdn.net/nyroro/article/details/45268767 https://vjudge.net/solution/1919422 #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; #define maxn 110 struct point{ int x,y; point(){} point(i

Monotone Chain Convex Hull(单调链凸包)

1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m]个点,ans为要求的点; 5 struct P 6 { 7 int x,y; 8 friend int operator < (P a, P b) 9 { 10 if((a.x<b.x) || (a.x==b.x && a.y<b.y)) 11 return 1; 12 r

POJ1259 The Picnic 最大空凸包问题 DP

POJ1259 给定平面上100个点 求一个最大的凸包,使得它不包含其中任意点,且凸包的顶点是题目所给的点. 枚举凸包左下角的点,顺时针枚举第二个点, 用opt[i][j]记录 i作为第二个点, 且第三个点k在向量i->j的右手(保持凸性) 显然相邻的凸包可以用来转移, opt[j][h]可以加入opt[i][j]  大致思想就是这样 看Solve函数. #include<iostream> #include<cstdio> #include<cstdlib> #

Gym 101986D Making Perimeter of the Convex Hull Shortest(凸包+极角排序)

首先肯定是构造一个完整的凸包包括所有的点,那么要使得刚好有两个点在外面,满足这个条件的只有三种情况. 1.两个在凸包上但是不连续的两个点. 2.两个在凸包上但是连续的两个点. 3.一个在凸包上,还有一个在这个点去掉后这段新凸包边上的一个点. 如何快速的截取新凸包的点是谁呢,我们可以将整个凸包划分区域,每个点删掉后,只可能在这块区域内选择新的点.那么我们就可以随机在凸包内部选择一个点,我使用的是凸包的重心作为坐标原点o,那么整个凸包移到原点处,然后在这个点的左侧和右侧的三角形区域内才是有可能构成新

Hdu 3662 3D Convex Hull(三维凸包)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3662 思路:三维凸包模板. #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define PR 1e-8 #define N 510 using namespace std; struct TPoint { doub

hdu6219(最大空凸包)

题意: 给一些点,求出一个最大的空凸包,这个凸包里没有任何给定点且要求这个凸包面积最大 分析: 枚举凸包左下角的点,然后dp[i][j]表示凸包的最后两条边是j->i和i->O情况下凸包的面积最大值,这个是O(n^4)的 可以利用凸性求个前缀和来完成O(1)的转移 具体看这里:https://blog.csdn.net/nyroro/article/details/45268767 1 #include<bits/stdc++.h> 2 using namespace std; 3

Game of Taking Stones &amp;&amp; POJ1259 /// 最大空凸包 几何+DP

题目大意: 给定n个点 求出这n个点中最大空凸包的面积 只放个模板 一份模板过两题(滑稽 这个讲解够详细了 https://blog.csdn.net/nyroro/article/details/45268767 #include <stdio.h> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const double eps=1e-8; dou

例4.10 POJ3525/LA3890离海最远的点 半平面交 + 二分法 + double小数点后有效位数处理方式/printf与g++、c++的问题

0) 题意: 题意很简单,给出一张四面环海的岛屿的地图,岛屿用顶点表示(题目数据保证岛屿是凸多边形--所谓凸多边形与凹多边形区别,凸多边形就是把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,那么这个多边形就叫做凸多边形.)找出岛屿上距离大海距离最长的一个点.即求岛屿上距离岛屿各条边边中最短的距离是所有点中最长的那个点.即求岛屿中的内接圆的圆心点.输出这个点到岛屿的边的最短的距离.即该岛屿中那个内接圆的半径... 分析: 半平面交求内核点集是一个点的情况(用精