#include #include #include #include #include #include using namespace std; struct Point { int x, y; }; double max_S = 0, min_S = INT_MAX; void makeCombiUtil(vector& tmp, vector& points, int n, int left, int k) { if (k == 0) { double side1 = sqrt(pow((tmp[0].x - tmp[1].x), 2) + pow((tmp[0].y - tmp[1].y), 2)); double side2 = sqrt(pow((tmp[0].x - tmp[2].x), 2) + pow((tmp[0].y - tmp[2].y), 2)); double side3 = sqrt(pow((tmp[1].x - tmp[2].x), 2) + pow((tmp[1].y - tmp[2].y), 2)); double half_p = (side1 + side2 + side3) / 2; double S = sqrt(half_p * (half_p - side1) * (half_p - side2) * (half_p - side3)); if (S <= min_S) { min_S = S; } if (S >= max_S) { max_S = S; } return; } for (int i = left; i < n; ++i) { tmp.push_back(points[i]); makeCombiUtil(tmp, points, n, i + 1, k - 1); tmp.pop_back(); } } void findAllCombinations(vector points) { vector tmp; makeCombiUtil(tmp, points, points.size(), 0, 3); } int main() { ifstream inp("triangle.in"); ofstream out("triangle.out"); vector points; int t, n, x, y; inp >> t; while (t--) { min_S = INT_MAX; max_S = 0; points.clear(); inp >> n; for (int i = 0; i < n; i++) { inp >> x >> y; Point point; point.x = x; point.y = y; points.push_back(point); } findAllCombinations(points); out << round(min_S) << " " << round(max_S) << endl; } return 0; }