#include using namespace std; template using vc = vector; template using vvc = vector>; template using vvvc = vector>; template using vvvvc = vector>; template using vvvvvc = vector>; #define vv(type, name, h, w) vector> name(h, vector(w)) #define vvv(type, name, h, w, l) vector>> name(h, vector>(w, vector(l))) #define vvvv(type, name, a, b, c, d) vector>>> name(a, vector>>(b, vector>(c, vector(d)))) #define vvvvv(type, name, a, b, c, d, e) vector>>>> name(a, vector>>>(b, vector>>(c, vector>(d, vector(e))))) #define elif else if #define FOR1(a) for (long long _ = 0; _ < (long long)(a); _++) #define FOR2(i, n) for (long long i = 0; i < (long long)(n); i++) #define FOR3(i, l, r) for (long long i = l; i < (long long)(r); i++) #define FOR4(i, l, r, c) for (long long i = l; i < (long long)(r); i += c) #define FOR1_R(a) for (long long _ = (long long)(a) - 1; _ >= 0; _--) #define FOR2_R(i, n) for (long long i = (long long)(n) - 1; i >= (long long)(0); i--) #define FOR3_R(i, l, r) for (long long i = (long long)(r) - 1; i >= (long long)(l); i--) #define FOR4_R(i, l, r, c) for (long long i = (long long)(r) - 1; i >= (long long)(l); i -= (c)) #define overload4(a, b, c, d, e, ...) e #define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__) #define FOR_R(...) overload4(__VA_ARGS__, FOR4_R, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__) #define FOR_in(a, A) for (auto a: A) #define FOR_each(a, A) for (auto &&a: A) #define FOR_subset(t, s) for(long long t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s))) #define all(x) x.begin(), x.end() #define len(x) int(x.size()) int popcount(int x) { return __builtin_popcount(x); } int popcount(uint32_t x) { return __builtin_popcount(x); } int popcount(long long x) { return __builtin_popcountll(x); } int popcount(uint64_t x) { return __builtin_popcountll(x); } // __builtin_clz(x)は最上位bitからいくつ0があるか. int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); } int topbit(uint32_t x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); } int topbit(long long x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } int topbit(uint64_t x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } // 入力 void rd() {} void rd(char &c) { cin >> c; } void rd(string &s) { cin >> s; } void rd(int &x) { cin >> x; } void rd(uint32_t &x) { cin >> x; } void rd(long long &x) { cin >> x; } void rd(uint64_t &x) { cin >> x; } template void rd(vector &v) { for (auto& x:v) rd(x); } void read() {} template void read(H &h, T &... t) { rd(h), read(t...); } #define CHAR(...) \ char __VA_ARGS__; \ read(__VA_ARGS__) #define STRING(...) \ string __VA_ARGS__; \ read(__VA_ARGS__) #define INT(...) \ int __VA_ARGS__; \ read(__VA_ARGS__) #define U32(...) \ uint32_t __VA_ARGS__; \ read(__VA_ARGS__) #define LL(...) \ long long __VA_ARGS__; \ read(__VA_ARGS__) #define U64(...) \ uint64_t __VA_ARGS__; \ read(__VA_ARGS__) #define VC(t, a, n) \ vector a(n); \ read(a) #define VVC(t, a, h, w) \ vector> a(h, vector(w)); \ read(a) //出力 void wt() {} void wt(const char c) { cout << c; } void wt(const string s) { cout << s; } void wt(int x) { cout << x; } void wt(uint32_t x) { cout << x; } void wt(long long x) { cout << x; } void wt(uint64_t x) { cout << x; } void wt(double x) { cout << fixed << setprecision(16) << x; } void wt(long double x) { cout << fixed << setprecision(16) << x; } template void wt(const vector v) { int n = v.size(); for (int i = 0; i < n; i++) { if (i) wt(' '); wt(v[i]); } } void print() { wt('\n'); } template void print(Head &&head, Tail &&... tail) { wt(head); if (sizeof...(Tail)) wt(' '); print(forward(tail)...); } ///////////////////////////////////////////////////////////////////////////////////////// long long min(long long a, long long b) { return a < b ? a : b; } template T min(vector A) { assert (A.size()); T S = A[0]; for (T a : A) S = min(a, S); return S; } long long max(long long a, long long b) { return a > b ? a : b; } template T max(vector A) { assert (A.size()); T S = A[0]; for (T a : A) S = max(a, S); return S; } long long add(long long x, long long y) {return x + y; } template mint add(mint x, mint y) { return x + y; } template bool chmin(T & x, T a) { return a < x ? (x = a, true) : false; } template bool chmax(T & x, T a) { return a > x ? (x = a, true) : false; } template T sum(vector A) { T S = 0; for (int i = 0; i < int(A.size()); i++) S += A[i]; return S; } uint64_t random_u64(uint64_t l, uint64_t r) { static std::random_device rd; static std::mt19937_64 gen(rd()); std::uniform_int_distribution dist(l, r); return dist(gen); } long long gcd(long long a, long long b) { while (a) { b %= a; if (b == 0) return a; a %= b; } return b; } long long lcm(long long a, long long b) { if (a * b == 0) return 0; return a * b / gcd(a, b); } long long pow_mod(long long a, long long r, long long mod) { long long res = 1, p = a % mod; while (r) { if ((r % 2) == 1) res = res * p % mod; p = p * p % mod, r >>= 1; } return res; } long long mod_inv(long long a, long long mod) { if (mod == 1) return 0; a %= mod; long long b = mod, s = 1, t = 0; while (1) { if (a == 1) return s; t -= (b / a) * s; b %= a; if (b == 1) return t + mod; s -= (a / b) * t; a %= b; } } long long Garner(vector Rem, vector Mod, int MOD) { assert (Rem.size() == Mod.size()); long long mod = MOD; Rem.push_back(0); Mod.push_back(mod); long long n = Mod.size(); vector coffs(n, 1); vector constants(n, 0); for (int i = 0; i < n - 1; i++) { long long v = (Mod[i] + Rem[i] - constants[i]) % Mod[i]; v *= mod_inv(coffs[i], Mod[i]); v %= Mod[i]; for (int j = i + 1; j < n; j++) { constants[j] = (constants[j] + coffs[j] * v) % Mod[j]; coffs[j] = (coffs[j] * Mod[i]) % Mod[j]; } } return constants[n - 1]; } long long Tonelli_Shanks(long long a, long long mod) { a %= mod; if (a < 2) return a; if (pow_mod(a, (mod - 1) / 2, mod) != 1) return -1; if (mod % 4 == 3) return pow_mod(a, (mod + 1) / 4, mod); long long b = 3; if (mod != 998244353) { while (pow_mod(b, (mod - 1) / 2, mod) == 1) { b = random_u64(2, mod - 1); } } long long q = mod - 1; long long Q = 0; while (q % 2 == 0) { Q++, q /= 2; } long long x = pow_mod(a, (q + 1) / 2, mod); b = pow_mod(b, q, mod); long long shift = 2; while ((x * x) % mod != a) { long long error = (((pow_mod(a, mod - 2, mod) * x) % mod) * x) % mod; if (pow_mod(error, 1 << (Q - shift), mod) != 1) { x = (x * b) % mod; } b = (b * b) % mod; shift++; } return x; } ///////////////////////////////////////////////////////////////////////////////////////// // https://nyaannyaan.github.io/library/geometry/geometry-base.hpp // https://nyaannyaan.github.io/library/geometry/polygon.hpp using Real = long double; constexpr Real EPS = 1e-10; constexpr Real pi = 3.141592653589793238462643383279L; bool equals(Real a, Real b) { return fabs(b - a) < EPS; } int sign(Real a) { return equals(a, 0) ? 0 : a > 0 ? 1 : -1; } template struct PointBase { using P = PointBase; R x, y; PointBase() : x(0), y(0) {} PointBase(R _x, R _y) : x(_x), y(_y) {} template PointBase(const pair& p) : x(p.first), y(p.second) {} P operator+(const P& r) const { return {x + r.x, y + r.y}; } P operator-(const P& r) const { return {x - r.x, y - r.y}; } P operator*(R r) const { return {x * r, y * r}; } P operator/(R r) const { return {x / r, y / r}; } P& operator+=(const P& r) { return (*this) = (*this) + r; } P& operator-=(const P& r) { return (*this) = (*this) - r; } P& operator*=(R r) { return (*this) = (*this) * r; } P& operator/=(R r) { return (*this) = (*this) / r; } bool operator<(const P& r) const { return x != r.x ? x < r.x : y < r.y; } bool operator==(const P& r) const { return x == r.x and y == r.y; } bool operator!=(const P& r) const { return !((*this) == r); } P rotate(R rad) const { return {x * cos(rad) - y * sin(rad), x * sin(rad) + y * cos(rad)}; } R real() const { return x; } R imag() const { return y; } friend R real(const P& p) { return p.x; } friend R imag(const P& p) { return p.y; } friend R dot(const P& l, const P& r) { return l.x * r.x + l.y * r.y; } friend R cross(const P& l, const P& r) { return l.x * r.y - l.y * r.x; } friend R abs(const P& p) { return sqrt(p.x * p.x + p.y * p.y); } friend R norm(const P& p) { return p.x * p.x + p.y * p.y; } friend R arg(const P& p) { return atan2(p.y, p.x); } friend istream& operator>>(istream& is, P& p) { R a, b; is >> a >> b; p = P{a, b}; return is; } friend ostream& operator<<(ostream& os, const P& p) { return os << p.x << " " << p.y; } }; using Point = PointBase; using Points = vector; // ccw, 点の進行方向 int ccw(const Point& a, const Point& b, const Point& c) { Point x = b - a, y = c - a; if (cross(x, y) > EPS) return +1; // 反時計回り if (cross(x, y) < -EPS) return -1; // 時計回り if (min(norm(x), norm(y)) < EPS * EPS) return 0; // c=a または c=b if (dot(x, y) < EPS) return +2; // c-a-b の順で一直線 if (norm(x) < norm(y)) return -2; // a-b-c の順で一直線 return 0; // a-c-b の順で一直線 } using Polygon = vector; // 多角形の内部に点があるか? // OUT : 0, ON : 1, IN : 2 int contains_polygon(const Polygon &Q, const Point &p) { bool in = false; for (int i = 0; i < (int)Q.size(); i++) { Point a = Q[i] - p, b = Q[(i + 1) % Q.size()] - p; if (imag(a) > imag(b)) swap(a, b); if (sign(imag(a)) <= 0 && 0 < sign(imag(b)) && sign(cross(a, b)) < 0) in = !in; if (equals(cross(a, b), 0) && sign(dot(a, b)) <= 0) return 1; } return in ? 2 : 0; } // 多角形の面積 Real area(const Polygon &p) { Real A = 0; for (int i = 0; i < (int)p.size(); ++i) { A += cross(p[i], p[(i + 1) % p.size()]); } return A * 0.5; } // 頂点集合から凸包を生成 // boundary : 周上の点も列挙する場合 true template Polygon convex_hull(vector ps) { sort(begin(ps), end(ps)); ps.erase(unique(begin(ps), end(ps)), end(ps)); int n = ps.size(), k = 0; if (n <= 2) return ps; vector ch(2 * n); // 反時計周り Real th = boundary ? -EPS : +EPS; for (int i = 0; i < n; ch[k++] = ps[i++]) { while (k >= 2 && cross(ch[k - 1] - ch[k - 2], ps[i] - ch[k - 1]) < th) --k; } for (int i = n - 2, t = k + 1; i >= 0; ch[k++] = ps[i--]) { while (k >= t && cross(ch[k - 1] - ch[k - 2], ps[i] - ch[k - 1]) < th) --k; } ch.resize(k - 1); return ch; } // 凸包の内部に点があるか? // OUT : 0, ON : 1, IN : 2 int contains_convex(const Polygon &C, const Point &p) { int N = C.size(); auto b1 = cross(C[1] - C[0], p - C[0]); auto b2 = cross(C[N - 1] - C[0], p - C[0]); if (b1 < -EPS or b2 > EPS) return 0; int L = 1, R = N - 1; while (L + 1 < R) { int M = (L + R) / 2; (cross(p - C[0], C[M] - C[0]) >= 0 ? R : L) = M; } auto v = cross(C[L] - p, C[R] - p); if (equals(v, 0)) { return 1; } else if (v > 0) { return equals(b1, 0) or equals(b2, 0) ? 1 : 2; } else { return 0; } } void solve() { Points P; INT(N); FOR(N) { LL(X, Y); Point p(X, Y); P.push_back(p); } Polygon poly = convex_hull(P); string ans = "Yes"; if (int(poly.size()) != N) ans = "No"; print(ans); } int main() { //INT(T); FOR(1) solve(); }