import std; void main () { int N = readln.chomp.to!int; auto X = new int[](N); auto Y = new int[](N); foreach (i; 0 .. N) { readln.read(X[i], Y[i]); } // 対角線を考えると、2つの三角形を大きくする問題に帰着。 // 三角形の面積はベクトル公式を用いると非常に簡単に書ける。 // 対角線に対してどちら側にある点なのかは外積で判定。 // O(N^3) int ans = 0; foreach (i; 0 .. N) { foreach (j; i + 1 .. N) { int l = -1; int r = -1; foreach (k; 0 .. N) { if (i == k || j == k) { continue; } // X[i], Y[i]を始点とみて判定 auto vec1 = tuple(X[j] - X[i], Y[j] - Y[i]); auto vec2 = tuple(X[k] - X[i], Y[k] - Y[i]); int v = vec1[0] * vec2[1] - vec1[1] * vec2[0]; if (0 < v) { l = max(l, v); } else { r = max(r, -v); } } if (l != -1 && r != -1) { ans = max(ans, l + r); } } } writeln(ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }