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; }