BAPC2014 C&&HUNNU11583:Citadel Construction(几何)
题意:
给出一系列的点,要求寻找最多4个点。使得组成一个面积最大的多边形
思路:
非常显然仅仅有两种情况。要么是三角形,要么是四边形
首先不难想到的是。先要把最外面的点都找出来,事实上就是找凸包
可是并没有做过凸包,那么怎么办?
我们知道。ab与ac向量相乘得到ab*ac>=0的情况下。能够知道全部符合这个条件的。都固定在顺时针,那么我们能够通过这个,来求得全部外层的点
得到这些点之后。我们就能够来找出答案了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std; #define ls 2*i
#define rs 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define ULL unsigned long long
#define N 1005
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define rank rank1
const int mod = 1000000007; struct point
{
int x,y;
} a[N],s[N];
int t,n; int ads(int a)
{
return a<0?-a:a;
} int mult(point a,point b,point c)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
} int cmp(point a,point b)
{
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
} int set1(point a[],int n,point s[])
{
int i,j,k;
int top = 1;
sort(a,a+n,cmp);
if(n==0) return 0;
s[0] = a[0];
if(n==1) return 1;
s[1] = a[1];
if(n==2) return 2;
s[2] = a[2];
for(i = 2; i<n; i++)//先找右边的外层
{
while(top&&mult(a[i],s[top],s[top-1])>=0)//新进来的在顺时针方向,能够代替已保存在栈内的
top--;
s[++top] = a[i];
}
int len = top;
s[++top] = a[n-2];
for(i = n-3; i>=0; i--)//找左边的外层
{
while(top!=len&&mult(a[i],s[top],s[top-1])>=0)
top--;
s[++top] = a[i];
}
return top;
} void solve()
{
int i,j,k,cnt,area;
for(int i=0; i<n; i++)
scanf("%d%d",&a[i].x,&a[i].y);
cnt = set1(a,n,s);
if(cnt<3)
{
printf("0\n");
}
else if(cnt==3)
{
area = mult(s[2],s[1],s[0]);
area = ads(area);
if(area%2) printf("%d.5\n",area/2);
else printf("%d\n",area/2);
}
else
{
area=-INF;
s[cnt] = s[0];
for(i = 0; i<cnt; i++)
{
int l = i,r = i+2;
for(j = i+2; j<cnt; j++)//以i,j为四边形对角线。两边循环保证两个三角形不相交算出最大面积
{
while(abs(mult(s[l+1],s[j],s[i]))>abs(mult(s[l],s[j],s[i]))) l = (l+1)%cnt;
int s1 = abs(mult(s[l],s[j],s[i]));
while(abs(mult(s[r+1],s[j],s[i]))>abs(mult(s[r],s[j],s[i]))) r = (r+1)%cnt;
int s2 = abs(mult(s[r],s[j],s[i]));
area = max(area,s1+s2);
}
}
if(area%2) printf("%d.5\n",area/2);
else printf("%d\n",area/2);
}
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
solve();
} return 0;
}
BAPC2014 C&&HUNNU11583:Citadel Construction(几何)的更多相关文章
- Construction of Primitives in Open Cascade
Construction of Primitives in Open Cascade eryar@163.com 一.创建基本图元 Making Primitives 将用到如下的类创建基本图元,包括 ...
- ArcEngine开发各种几何错误代码
E_GEOMETRY_AMBIGUOUSPARTTYPE - Static variable in interface com.esri.arcgis.geometry.esriGeometryErr ...
- HDU 5128.The E-pang Palace-计算几何
The E-pang Palace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Othe ...
- 关于Three.js基本几何形状之SphereGeometry球体学习
一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...
- 几何服务,cut功能测试
关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...
- 几何服务,cut功能,输入要素target(修改后)内容。
几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...
- 几何服务,cut功能,输入要素target(修改前)内容。
几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...
- 如何让你的UWP应用程序无缝调用几何作图
有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...
- poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
/* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #incl ...
随机推荐
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一
Grabage Collection GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...
- php7 兼容 MySQL 相关函数
php7 兼容 MySQL 相关函数 PHP7 废除了 ”mysql.dll” ,推荐使用 mysqli 或者 pdo_mysql http://PHP.net/manual/zh/mysqlinfo ...
- shape- 设置虚线
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- 新手前端笔记之--css盒子
css盒子就是它的盒模型,所有css的布局都是以此作为基础的,很有必要来详细记录一下. 1.盒子的尺寸就是margin+padding+border+content的总和,这很好理解,但令人迷惑的可能 ...
- C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- 配置mysql的ODBC数据源
如果你已经安装好了mysql和mysql连接驱动,则可以向下进行了 打开控制面板,以小图标的形式查看,找到管理工具 打开管理工具,找到数据源(odbc),打开 在图片中所圈出的三个标签中随便选一个,点 ...
- Relaxation step(Dijkstra's 最短路径算法)
翻译成中文就是"松弛",属于工程优化的范畴: Dijkstra 的单源最短路径算法,有一个重要的步奏,当访问到新的结点 u (加入到集合 S),然后遍历 u 的邻接顶点(Adj), ...
- 解决Win8/8.1无法正确识别USB3.0的问题
找一个USB3.0的移动硬盘到了手里竟然变成2.0的了!二了! 不能忍啊. 听说是快速启动的问题,但是开机速度快很诱人. 百度了其他解决方法,终于解决了. 下面摘录自: http://blog.csd ...
- Eclipse如何从SVN更新和上传修改部分项目
1:右击项目,选择team菜单,点击与资源库同步 2:第一个箭头表示别人改动的部分 3:右击,更新,将同事改动的部分同步到自己的项目里面 4:第二个指向右边的箭头表示自己修改的文件 5:右击,提交,将 ...
- ECMALL功能拓扑图以及模式分析
ECMALL VS 常规的B2C产品(以ECSHOP做对比)的区别: 1.支持多用户在同一个域名下开店. 2.开店的卖家各自结算,直接收钱.平台只是提供了一个类似传统行业的摊位.平台不过手金钱 3 ...