Description:

话说上回讲到海东集团推选老总的事情,最终的结果是XHD以微弱优势当选,从此以后,“徐队”的称呼逐渐被“徐总”所取代,海东集团(HDU)也算是名副其实了。
创业是需要地盘的,HDU向钱江肉丝高新技术开发区申请一块用地,很快得到了批复,据说这是因为他们公司研发的“海东牌”老鼠药科技含量很高,预期将占全球一半以上的市场。政府划拨的这块用地是一个多边形,为了描述它,我们用逆时针方向的顶点序列来表示,我们很想了解这块地的基本情况,现在请你编程判断HDU的用地是凸多边形还是凹多边形呢?

Input:

输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,yi),n为0的时候结束输入。

Output:

对于每个测试实例,如果地块的形状为凸多边形,请输出“convex”,否则输出”concave”,每个实例的输出占一行。

Sample Input:

4
0 0 1 0 1 1 0 1
0

Sample Output:

convex

Hint:

海东集团终于顺利成立了!后面的路,他们会顺顺利利吗?
欲知后事如何,且听下回分解——

题目链接

判断多边形是凸多边形还是凹多边形。

对于多边形的任意一条边,多边形其它顶点都在这条边所在直线的一侧则多边形为凸多边形,反之为凹多边形。

题目将多边形顶点按照逆时针顺序给出,所以使用叉乘依次判断顶点是否在前面的两个顶点所在直线逆时针方向即可。

直线属于凸多边形,注意判断第一和第二个顶点。

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define XDebug(x) cout<<#x<<"="<<x<<endl;
#define ArrayDebug(x,i) cout<<#x<<"["<<i<<"]="<<x[i]<<endl;
#define print(x) out(x);putchar('\n');
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
typedef pair<ll,ll> PLL;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + 5;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double pi = asin(1.0) * 2;
const double e = 2.718281828459;
template <class T>
inline bool read(T &ret) {
	char c;
	int sgn;
	if (c = getchar(), c == EOF) {
		return 0;
	}
	while (c != '-' && (c < '0' || c > '9')) {
		c = getchar();
	}
	sgn = (c == '-') ? -1 : 1;
	ret = (c == '-') ? 0 : (c - '0');
	while (c = getchar(), c >= '0' && c <= '9') {
		ret = ret * 10 + (c - '0');
	}
	ret *= sgn;
	return 1;
}
template <class T>
inline void out(T x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9) {
		out(x / 10);
	}
	putchar(x % 10 + '0');
}

struct Point {
	double x, y;
	Point(double _x = 0.0, double _y = 0.0): x(_x), y(_y) {}
	void input() {
		scanf("%lf%lf", &x, &y);
	}
	void output() {
		printf("%lf %lf", x, y);
	}
	bool operator == (const Point &b) const {
		return x == b.x && y == b.y;
	}
	Point operator - (const Point &b) const {
		return Point{x - b.x, y - b.y};
	}
	double operator ^ (const Point &b) const {
		return x * b.y - y * b.x;
	}
};

int main(int argc, char *argv[]) {
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif
	int n;
	while (read(n) && n) {
		vector<Point> points(n);
		bool flag = 1;
		for (int i = 0; i <= n + 1; ++i) {
			if (i == n) {
				points.pb(points[0]);
			}
			else if (i == n + 1) {
				points.pb(points[1]);
			}
			else {
				points[i].input();
			}
			if (i > 1) {
				if (((points[i - 1] - points[i - 2]) ^ (points[i] - points[i - 2])) <= 0) {
					flag = 0;
				}
			}
		}
		if (flag) {
			printf("convex\n");
		}
		else {
			printf("concave\n");
		}
	}
#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	system("gedit out.txt");
#endif
    return 0;
}