BZOJ 2146 Construct 计算几何

题目大意:给定曼哈顿空间下的一个多边形,求这个多边形的凸包的周长和面积

注意是曼哈顿空间

第一问直接用个最小的矩形框一下就好

第二问就要求曼哈顿空间内的凸包了

容易YY出来曼哈顿空间下的凸包一定是这种东西

我们将这个凸包分成左上 右上 左下 右下四部分

那么每部分都是一个单调增的点序列 扫一遍就行

求出凸包上的关键点之后(图中所有凸出来的点)计算下面积即可

此外应某人不想这么快看到题解的要求就让它审核一下吧 放个链接啥的 http://blog.csdn.net/popoqqq

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
#define INF 0x3f3f3f3f
using namespace std;
struct Point{
	long long x,y;
	friend istream& operator >> (istream &_,Point &p)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		p.x=x;p.y=y;
		return _;
	}
	bool operator < (const Point &p) const
	{
		if(x!=p.x)
			return x<p.x;
		return y<p.y;
	}
}points[M];
int n;
long long min_y=INF,max_y=-INF,area;
void Get_Convex_Hull()
{
	static Point *stack[M];
	int i,top=0;

	for(i=1;i<=n;i++)
	{
		if(!top||points[i].y>=stack[top]->y)
			stack[++top]=&points[i];
		if(points[i].y==max_y)
			break;
	}
	for(i++;i<=n;i++)
	{
		while(points[i].y>stack[top]->y)
			stack[top--]=0x0;
		stack[++top]=&points[i];
	}
	for(i=2;i<=top;i++)
		area+=min(stack[i-1]->y,stack[i]->y)*(stack[i]->x-stack[i-1]->x);

	top=0;
	for(i=1;i<=n;i++)
	{
		if(!top||points[i].y<=stack[top]->y)
			stack[++top]=&points[i];
		if(points[i].y==min_y)
			break;
	}
	for(i++;i<=n;i++)
	{
		while(points[i].y<stack[top]->y)
			stack[top--]=0x0;
		stack[++top]=&points[i];
	}
	for(i=2;i<=top;i++)
		area-=max(stack[i-1]->y,stack[i]->y)*(stack[i]->x-stack[i-1]->x);
}
int main()
{
	int i;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>points[i];
		min_y=min(min_y,points[i].y);
		max_y=max(max_y,points[i].y);
	}
	sort(points+1,points+n+1);
	cout<<( (max_y-min_y)+(points[n].x-points[1].x)<<1 )<<endl;
	Get_Convex_Hull();
	cout<<area<<endl;
	return 0;
}
时间: 2024-08-10 23:30:50

BZOJ 2146 Construct 计算几何的相关文章

bzoj2146 Construct

2146: Construct Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 126  Solved: 52 [Submit][Status][Discuss] Description 随着改革开放的深入推进-- 小T家要拆迁了-- 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于市中心,拆迁工作又难以进行,有关部门决定先把小T家用围栏围起来,以免影响市容.考虑到要建设资源节

BZOJ 2433 智能车比赛(计算几何+最短路)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两点S和T,两点均在矩形内.求S到T的最短路径.只能在矩形内部走. 思路:首先,S到T若有转弯,必定是在矩形 的顶点处转弯.因此,只要建立任意两可达顶点(包含S和T)之间距离求最短路即可.若暴力枚举任意两点再判是否可达复杂度O(n^3).优化.枚举起点 a,从左向右扫遍矩形,利用叉积维护关于该点a的上

[BZOJ 1027][JSOI2007]合金(计算几何+Floyd最小环)

Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的铁铝锡比重为用户所需要的比重. 现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重.公司希望能够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类的合金. Solution 今天考试T3的70分算法似乎是这道原题(然而我没做过QwQ) 思路值得学习一下(

bzoj 1964: hull 三维凸包 计算几何

1964: hull 三维凸包 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 54  Solved: 39[Submit][Status][Discuss] Description 三维凸包问题是一个基础的三维计算几何问题,不过这次你只需要做一个简单版的三维凸包问题就行了. Input 输入数据一共有若干行,每行三个整数,表示一个点的坐标.点的个数为五个. Output 输出一个实数,保留两位小数,表示三维凸包的体积. Sample Input 0

计算几何模板 (bzoj 1336,poj 2451 ,poj3968)

poj 3968 (bzoj 2642) 二分+半平面交,每次不用排序,这是几个算几版综合. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<deque> using namespace std; #define MAXN 100000 na

BZOJ 1027 JSOI2007 合金 计算几何+Floyd

题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所以我们仅仅要得到a和b就可以 c=1-a-b 所以c能够不读入了 然后我们把每种原料抽象成一个点 可知两个点能合成的合金一定在两点连线的线段上 证明:设两个点为(x1,y1)和(x2,y2),新合成的合金为(ax1+bx2,ay2+by2) (a+b=1,a,b>0) 两点连线为(y-y1)/(x-

BZOJ 1502 NOI 2005 月下柠檬树 计算几何 自适应辛普森积分

题目大意:有一个由圆锥和圆台组成的柠檬树,在月亮发出的平行光下,可以形成一个影子,求这个影子的面积. 思路:理解投影的性质:只要是平行光线,投影在水平面上,所得的图形都与原图形全等. 知道了这一点我们就可以画画图,分析就知道,其实柠檬树的影子,就是一些园和等腰梯形的面积的并.(如下图,样例) 运用计算几何的知识就可以得到圆的方程和圆的公切线的方程,然后得到一个连续的函数.最后这个题就成为一直函数的解析式,求这个函数与X轴之间的面积. 套用辛普森积分:Simpson(l,r) = (F(l) +

BZOJ 1199 HNOI2005 汤姆的游戏 计算几何+暴力

题目大意:给定n个图形,每个图形可以是矩形或圆,m次询问某个点在多少个图形内部 将点按横坐标排序 对于每个图形,二分找到x值满足要求的区间,对于区间内每个点暴力 时间复杂度O(n^2) 数据范围25W 果然像hwd说的一样计算几何题数据范围出的这么大就是作死么= = #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&

bzoj 1007: [HNOI2008]水平可见直线(计算几何)

1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5503  Solved: 2078 [Submit][Status][Discuss] Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是