#include"testlib.h" #include #include #include #include using ll = long long; const ll Nmin = 3; const ll Nmax = 100; const ll Xmin = -1'000'000; const ll Xmax = +1'000'000; struct P { ll x, y; friend P operator-(P a, P b){ a.x -= b.x; a.y -= b.y; return a; } }; ll cross(P a, P b){ return a.x*b.y - a.y*b.x; } int main(){ registerValidation(); ll N = inf.readLong(Nmin, Nmax); inf.readEoln(); std::vector

a(N); for (ll i = 0; i < N; i++){ ll x = inf.readLong(Xmin, Xmax); inf.readSpace(); ll y = inf.readLong(Xmin, Xmax); inf.readEoln(); a[i] = {x,y}; } inf.readEof(); // ccw { for (ll i = 0; i < N; i++){ ll j = (i + 1) % N; ll k = (i + 2) % N; ll cr = cross(a[j] - a[i], a[k] - a[j]); inf.ensuref(cr > 0, "ccw and not colinear"); } } // distinct { std::set> st; for (auto [x, y] : a){ st.insert({x, y}); } inf.ensuref((ll)st.size() == N, "points are distinct"); } // convex { for (ll i = 0; i < N; i++){ ll j = (i + 1) % N; // all points are located at the same side partitioned by line a[i]-a[j] for (ll k = 0; k < N; k++){ if (k == i || k == j) continue; ll cr = cross(a[j] - a[i], a[k] - a[j]); inf.ensuref(cr > 0, "convex"); } } } // area is positive : cross(a[2] - a[1], a[1] - a[0]) > 0 }