POJ 1228

给题意跪了。。。

题目输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳定就是判断能不能在原有凸包上加点,

得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。

这样,只需判断每条边是否有大于等于三点即可。注意,一条直线的凸包是NO

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

struct point {
	int x,y;
}p[1050];
int n;
int stop,cnt;
int ans[1050],st[1050];

bool cmp(point A,point B){
	if(A.y<B.y) return true;
	else if(A.y==B.y){
		if(A.x<B.x) return true;
	}
	return false;
}

bool multi(point a,point b,point c){
	return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x)>0;
}

void slove(){
	stop=cnt=0;
	st[stop++]=0; st[stop++]=1;
	for(int i=2;i<n;i++){
		while(stop>1&&multi(p[i],p[st[stop-1]],p[st[stop-2]])) stop--;
		st[stop++]=i;
	}
	for(int i=0;i<stop;i++)
	ans[cnt++]=st[i];
	stop=0;
	st[stop++]=n-1; st[stop++]=n-2;
	for(int i=n-3;i>=0;i--){
		while(stop>1&&multi(p[i],p[st[stop-1]],p[st[stop-2]])) stop--;
		st[stop++]=i;
	}
	for(int i=1;i<stop;i++)
	ans[cnt++]=st[i];
}

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d%d",&p[i].x,&p[i].y);
		}
		sort(p,p+n,cmp);
		slove();
/*		for(int i=0;i<cnt;i++){
			cout<<p[ans[i]].x<<‘ ‘<<p[ans[i]].y<<endl;
		}*/
		if(n==1||n==2) { printf("NO\n"); continue; }
		bool flag=true; point s,t,e; int k;
		s=p[ans[0]]; t=p[ans[1]];
		int j;
		for(j=2;j<cnt;j++){
			e=p[ans[j]];
			if((e.x-s.x)*(t.y-s.y)-(e.y-s.y)*(t.x-s.x)!=0){
				break;
			}
		}
		if(j>=cnt) { printf("NO\n"); continue; }
		for(int i=0;;i=k-1){
			s=p[ans[i]];t=p[ans[++i]];
			if(i+1>=cnt){ flag=false; break; }
		 	e=p[ans[i+1]];
			if((e.x-s.x)*(t.y-s.y)-(e.y-s.y)*(t.x-s.x)!=0){
				flag=false;
				break;
			}
			k=i+1;
			while(true){
				e=p[ans[k]];
				if((e.x-s.x)*(t.y-s.y)-(e.y-s.y)*(t.x-s.x)!=0){
					break;
				}
				k++;
				if(k>=cnt) break;
			}
			if(k>=cnt) break;
		}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

  

POJ 1228,布布扣,bubuko.com

时间: 2024-11-18 03:09:31

POJ 1228的相关文章

POJ 1228 Grandpa&#39;s Estate [稳定凸包]

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13112   Accepted: 3697 Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one

【POJ 1228】Grandpa&#39;s Estate 凸包

找到凸包后暴力枚举边进行$check$,注意凸包是一条线(或者说两条线)的情况要输出$NO$ #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define N 1003 #define read(x) x = getint() using namespace std; inline int getint() { int k = 0, fh = 1; char c

Grandpa&#39;s Estate POJ - 1228

Grandpa's Estate POJ - 1228 题意:给一些点,问能否唯一确定一个凸包. 先求凸包,当且仅当每条边都至少三个点时可唯一确定一个凸包. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=1010; 7 8 struct Node{ 9 i

poj 1228 Grandpa&#39;s Estate (稳定凸包问题)

---恢复内容开始--- 题意:你的长辈给你留了块土地,然而这块土地是以一些钉子来界定的,题目要做的就是给你一堆钉子的坐标(也就是凸包上部分的点),然后问你能不能唯一确定这块土地 //不得不说知道题意后一脸懵逼.. 知识:稳定凸包 所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点. 举一个不稳定的例子 为什么说它不稳定呢?因为他可以加点来得到更大的凸包 那什么样子是稳定的呢? 因此我们可以知道当一个凸包稳定时,凸包的每条边上都要有至少三个点,若只有两

POJ 1228 Grandpa&#39;s Estate --深入理解凸包

题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类似下面的语句: for(int i=0;i<n;i++) { while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--; ch[m++] = p[i]; } 这样的话,求出来就是最简凸包,即点数尽量少的凸包,因

poj 1228 Grandpa&#39;s Estate(凸包)

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11508   Accepted: 3188 Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one

Grandpa&#39;s Estate - POJ 1228(稳定凸包)

刚开始看这个题目不知道是什么东东,后面看了大神的题解才知道是稳定凸包问题,什么是稳定凸包呢?所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点.知道了这个东西就简单了,直接求出来凸包后,然后判断每条边上的点是否超过三点就行了. 代码如下: ============================================================================================================

POJ 1228 Grandpa&#39;s Estate (稳定凸包)

读懂题意很关键,输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定.所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点. 首先来了解什么是稳定的凸包. 比如有4个点: 这四个点是某个凸包上的部分点,他们连起来后确实还是一个凸包,但是它们不是稳定的, 我们发现,当凸包上存在一条边上的点只有端点两个点的时候,这个凸包不是稳定的,因为它可以在这条边外再引入一个点,构成一个新的凸包.但一旦一条边上存在三个点,那么不

poj 1228(稳定凸包)

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12204   Accepted: 3430 Description Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one