void convex_hull(points &a, points &res) { res.resize(2 * a.size() + 10); sort(a.begin(), a.end(), cmpxy); a.erase(unique(a.begin(), a.end()), a.end()); int m = 0; for (int i = 0; i < (int)a.size(); i ++) { while(m > 1 && dcmp(det(res[m - 1] - res[m - 2], a[i] - res[m - 2])) <= 0) --m; res[m++] = a[i]; } int k = m; for (int i = (int)a.size() - 2; i >= 0; i --) { while(m > k && dcmp(det(res[m - 1] - res[m - 2], a[i] - res[m - 2])) <= 0) --m; res[m++] = a[i]; } res.resize(m); //if (a.size() > 1) res.resize(m - 1); }