题目大意:给定曼哈顿空间下的一个多边形,求这个多边形的凸包的周长和面积
注意是曼哈顿空间
第一问直接用个最小的矩形框一下就好
第二问就要求曼哈顿空间内的凸包了
容易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; }
原文:http://blog.csdn.net/popoqqq/article/details/43920135