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; }
bool violates(vpll ar, long long k){ //binary search over inervals int lo=0, hi = ar.size()-1; while(lo <=hi){ int mid = lo + (hi - lo )/2; if(ar[mid].first <= k && k <= ar[mid].second ) return true; else if(k < ar[mid].first) hi = mid - 1; else if(k > ar[mid].second) lo = mid + 1; } return false; }
inline pll find_max (pll v, vpll &points) { int l = 0; int r = points.size() - 1; int m; while (l < r) { m = (l + r)/2; //cout << "m: " << m << endl; if (((points[m + 1].x_ - points[m].x_) * v.x_ > - (points[m + 1].y_ - points[m].y_) * v.y_)) { /* cout << "1: " << (points[m + 1].x_ - points[m].x_) * v.x_ << endl; cout << "2: " << (points[m + 1].y_ - points[m].y_) * v.y_ << endl; cout << " lol " << (points[m + 1].x_ - points[m].x_) * v.x_ + (points[m + 1].y_ - points[m].y_) * v.y_ << endl; */ l = m + 1; // cout << "l: " << l << endl; } else { r = m; } } // cout << l << " " << r << endl; return points[l]; }