3
vector<vector<int>> outerTrees(vector<vector<int>> &trees) {4
if (trees.size() <= 1) return trees;7
for (int i = 0; i < trees.size(); ++i) {8
if (trees[origin][1] > trees[i][1] ||9
trees[origin][1] == trees[i][1] && trees[origin][0] > trees[i][0]) {13
swap(trees[0], trees[origin]);14
sort(trees.begin() + 1, trees.end(),15
[&](const vector<int> &lhs, const vector<int> &rhs) -> bool {16
int result = cross(trees[0], lhs, rhs);17
if (result != 0) return result > 0;18
return norm(trees[0], lhs) < norm(trees[0], rhs);21
// deal with cases that the last k points are on one line22
int pos = trees.size() - 2;23
while (pos > 0 && cross(trees[0], trees.back(), trees[pos]) == 0) {26
reverse(trees.begin() + pos + 1, trees.end());28
vector<vector<int>> ans = {trees[0], trees[1]};29
for (int i = 2; i < trees.size(); ++i) {30
int cross_result = cross(ans[ans.size() - 2], ans[ans.size() - 1], trees[i]);31
while (cross_result < 0) {33
cross_result = cross(ans[ans.size() - 2], ans[ans.size() - 1], trees[i]);35
ans.push_back(trees[i]);41
inline double norm(const vector<int> &o, const vector<int> &x) {44
return sqrt(xx * xx + yy * yy);47
inline int cross(const vector<int> &x, const vector<int> &y, const vector<int> &z) {48
return (y[0] - x[0]) * (z[1] - y[1]) - (y[1] - x[1]) * (z[0] - y[0]);