BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】
题目链接
题解
首先四个点一定在凸包上
我们枚举对角线,剩下两个点分别是两侧最远的点
可以三分,复杂度\(O(n^2logn)\)
可以借鉴旋转卡壳的思想,那两个点随着对角线的一定单调不减,可以用两个指针维护,复杂度\(O(n^2)\)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 2005,maxm = 100005,INF = 1000000000;
inline int read(){
	int out = 0,flag = 1; char c = getchar();
	while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
	while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
	return out * flag;
}
struct point{double x,y;}p[maxn],t[maxn];
inline bool operator <(const point& a,const point& b){
	return a.x == b.x ? a.y < b.y : a.x < b.x;
}
inline point operator +(const point& a,const point& b){
	return (point){a.x + b.x,a.y + b.y};
}
inline point operator -(const point& a,const point& b){
	return (point){a.x - b.x,a.y - b.y};
}
inline double operator *(const point& a,const point& b){
	return a.x * b.x + a.y * b.y;
}
inline double cross(const point& a,const point& b){
	return a.x * b.y - a.y * b.x;
}
inline double dis(const point& a,const point& b){
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
inline double S(const point& a,const point& b,const point& c){
	return fabs(0.5 * cross(c - a,c - b));
}
int n,st[maxn],top;
void cal(){
	sort(p + 1,p + 1 + n);
	st[top = 1] = 1;
	for (int i = 2; i <= n; i++){
		while (top > 1 && cross(p[i] - p[st[top]],p[st[top]] - p[st[top - 1]]) <= 0)
			top--;
		st[++top] = i;
	}
	int tmp = top;
	for (int i = n - 1; i; i--){
		while (top > tmp && cross(p[i] - p[st[top]],p[st[top]] - p[st[top - 1]]) <= 0)
			top--;
		st[++top] = i;
	}
	n = --top;
	for (int i = 1; i <= n; i++) t[i] = p[st[i]];
	for (int i = 1; i <= n; i++) p[i] = t[i];
}
void solve(){
	if (n == 3){printf("%.3lf",S(p[1],p[2],p[3])); return;}
	double ans = 0;
	for (int i = 1; i <= n - 3; i++){
		int x = i + 1,y = i + 3;
		for (int j = i + 3; j <= n; j++){
			if (S(p[i],p[i + 2],p[j]) > S(p[i],p[i + 2],p[y]))
				y = j;
		}
		ans = max(ans,S(p[i],p[i + 2],p[x]) + S(p[i],p[i + 2],p[y]));
		for (int j = i + 3; j <= n; j++){
			while (x + 1 < j && S(p[i],p[j],p[x + 1]) > S(p[i],p[j],p[x])) x++;
			while (y + 1 <= n && S(p[i],p[j],p[y + 1]) > S(p[i],p[j],p[y])) y++;
			ans = max(ans,S(p[i],p[j],p[x]) + S(p[i],p[j],p[y]));
		}
	}
	printf("%.3lf\n",ans);
}
int main(){
	n = read();
	if (n <= 2) {puts("0"); return 0;}
	REP(i,n) scanf("%lf%lf",&p[i].x,&p[i].y);
	cal();
	//REP(i,n) printf("(%lf,%lf)\n",p[i].x,p[i].y);
	solve();
	return 0;
}
												
											BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】的更多相关文章
- bzoj1069: [SCOI2007]最大土地面积  凸包+旋转卡壳求最大四边形面积
		
在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...
 - [BZOJ1069][SCOI2007]最大土地面积  凸包+旋转卡壳
		
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3669 Solved: 1451[Submit][Sta ...
 - luogu P4166 [SCOI2007]最大土地面积 凸包 旋转卡壳
		
LINK:最大土地面积 容易想到四边形的边在凸包上面 考虑暴力枚举凸包上的四个点计算面积. 不过可以想到可以直接枚举对角线的两个点找到再在两边各找一个点 这样复杂度为\(n^3\) 可以得到50分. ...
 - bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
		
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
 - BZOJ1069 SCOI2007 最大土地面积 凸包、旋转卡壳
		
传送门 在这里假设可以选择两个相同的点吧-- 那么选出来的四个点一定会在凸包上 建立凸包,然后枚举这个四边形的对角线.策略是先枚举对角线上的一个点,然后沿着凸包枚举另一个点.在枚举另一个点的过程中可以 ...
 - bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)
		
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2277 Solved: 853[Submit][Stat ...
 - 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
		
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
 - [SCOI2007]最大土地面积(旋转卡壳)
		
首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...
 - [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)
		
http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...
 - UVA 4728 Squares(凸包+旋转卡壳)
		
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
 
随机推荐
- 前端--再遇jQuery
			
一.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回第一个属性) attr(属性名|属性值) --一个参数是获取属性的值,两个参数是设置属性值 --点击图片加载示例 removeAttr(属 ...
 - 面试之HTTP基础(不断完善中)
			
目录 1. HTTP状态码 2.Cookie和Session Cookie Session 3.短连接与长连接 4.HTTPs 加密 5.Http和https的区别 6.HTTP/1.0 与 HTTP ...
 - PHP反序列化漏洞代码审计—学习资料
			
1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. ...
 - charles基本使用文档
			
Charles 主要的功能包括: 截取 Http 和 Https 网络封包. 支持重发网络请求,方便后端调试. 支持修改网络请求参数. 支持网络请求的截获并动态修改. 支持模拟慢速网络. Charle ...
 - PHP手动环境搭建之WAMP
			
第一步:安装apache程序 首先需要去Apache官网下载Apache2.4(http://httpd.apache.org/download.cgi),操作如下图所示: 下载完成后把它解压出来,然 ...
 - jquery中国地图插件
			
插件下载地址: http://www.17sucai.com/preview/1266961/2018-09-18/map/js/jsMap-1.1.0.min.js jsMap 项目介绍 这是一个功 ...
 - 排序(C语言实现)
			
读数据结构与算法分析 插入排序 核心:利用的是从位置0到位置P都是已排序的 所以从位置1开始排序,如果当前位置不对,则和前面元素反复交换重新排序 实现 void InsertionSort(Eleme ...
 - Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug
			
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
 - 《JavaScript》页面跳转
			
window.location.href: <i onclick="window.location.href = '/Form/Form_Write/Index?viewname=Fo ...
 - POJ 3258(二分求最大化最小值)
			
题目链接:http://poj.org/problem?id=3258 题目大意是求删除哪M块石头之后似的石头之间的最短距离最大. 这道题目感觉大致代码写起来不算困难,难点在于边界处理上.我思考边界思 ...