예제 #1
0
vpll convex_hull (vpll points) {
	i64 xmin = points[0].x_;
	int min = 0;
	for (int i = 1; i < points.size(); ++i) {
		if ((points[i].x_ < xmin) || (xmin == points[i].x_ && points[i].y_ < points[min].y_)) {
			xmin = points[i].x_;
			min = i;
		}
	}
	//cout << "min" << points[min].x_ << ' ' << points[min].y_ << endl;
	swap(points[0], points[min]);
	p0 = points[0];
	sort(points.begin() + 1, points.end(), &cmp);
	for (int i = 0; i < points.size(); ++i) {
		cout << points[i].x_ << " " << points[i].y_ << endl;
	}
	/*
	for (int i = 0; i < points.size(); ++i) {
		cout << points[i].x_ << " " << points[i].y_ << endl;
	}
	*/
	vpll stack;
	stack.pb(points[0]);
	stack.pb(points[1]);
	stack.pb(points[2]);
	for (int i = 3; i < points.size(); ++i) {
		int n = stack.size();
		//cout << "stack_size: " << n << endl;
		while (orientation(stack[n - 2], stack[n - 1], points[i])) {
			//cout << "pop\n";
			stack.pop_back();
			n = stack.size();
		}
		//cout << "push: " << points[i].x_ << ' ' << points[i].y_ << endl;
		stack.pb(points[i]);
	}
	return stack;
}