#include //#include #define _USE_MATH_DEFINES //aclをatcoder以外で使うときは'combine [ファイル名]'とターミナルに打てばよい // #include #include using namespace atcoder; using mint = modint998244353; // using mint = modint1000000007; using namespace std; // using mint = modint; using ll = long long; using ld = long double; using lll=__int128_t; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define rep2(i, s, n) for (ll i = (s); i < (ll)(n); i++) #define rrep(i,a,b) for(ll i=a;i>=b;i--) #define fore(i,a) for(auto &i:a) #define V vector #define Vi vector #define Vd vector #define Vld vector #define Vb vector #define Vs vector #define Vc vector #define VV vector using P = pair; using G = vector>; #define VP vector

#define VT vector> template using min_priority_queue = priority_queue, greater>; #define all(a) (a).begin(),(a).end() #define rall(a) (a).rbegin(),(a).rend() #define INF 1LL << 60 #define inf 1e9 template bool chmax(T &a, const T& b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } template bool chmin(T &a, const T& b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } long long combi(long long n, long long k) { if (n == k || k == 0) return 1; else { return combi(n - 1, k - 1) + combi(n - 1, k); } } //二項係数 #define CMAX 1010 int noinit = 1; ll acbmemo[CMAX][CMAX]; ll aCb(ll a, ll b) { if (noinit) { rep2(i, 0, CMAX) rep2(j, 0, CMAX) acbmemo[i][j] = -1; noinit = 0; } if (b == 0 || a == b) return 1; if (0 <= acbmemo[a][b]) return acbmemo[a][b]; return acbmemo[a][b] = aCb(a - 1, b - 1) + aCb(a - 1, b); } //整数かどうか bool isNumber(const string& str) { for (const char &c : str) { if (std::isdigit(c) == 0) return false; } return true; } ///* //最大公約数 ll gcd(ll a, ll b){ if(b==0){ return a; }else{ return gcd(b, a%b); } } //最小公倍数 ll lcm(ll a, ll b){ ll g=gcd(a,b); return a/g*b; } std::ostream &operator<<(std::ostream &dest, __int128_t value) { std::ostream::sentry s(dest); if (s) { __uint128_t tmp = value < 0 ? -value : value; char buffer[128]; char *d = std::end(buffer); do { --d; *d = "0123456789"[tmp % 10]; tmp /= 10; } while (tmp != 0); if (value < 0) { --d; *d = '-'; } int len = std::end(buffer) - d; if (dest.rdbuf()->sputn(d, len) != len) { dest.setstate(std::ios_base::badbit); } } return dest; } //*/ //int di[] = {-1,0,1,0}; //int dj[] = {0,-1,0,1}; //s = regex_replace(s, regex("あ"), "う"); /*stiring で char を検索するときは s.find(c)!=string::npos */ /*//各桁の和 int wa(int n){ int sum =0; while(n>0){ sum += n%10; n/=10; } return sum; } */ // /* //階乗 int ki(int i){ int k = 1; for(int j = 1; j<=i; j++){ k *= j; } return k; } // */ /*log_x(b) double logN(double x, double b) { return log(x) / log(b); } */ ///* //エラトステネスの篩O(NloglogN) main関数内にSieveofEratosthenes();を書き込む!! const ll N = 5050505;//求める範囲 Vb isp(N+1,true); void SieveofEratosthenes(){ isp[0] = false; isp[1] = false; for(ll i = 2; i+i<=N;i++){ if(isp[i])for(ll j = 2; i*j<=N;j++)isp[i*j] = false; } } //*/ ///* //約数列挙 O(√n) vector divisor(long long n) { vector ret; for (long long i = 1; i * i <= n; i++) { if (n % i == 0) { ret.push_back(i); if (i * i != n) ret.push_back(n / i); } } sort(ret.begin(), ret.end()); // 昇順に並べる return ret; } //*/ // /* //素因数分解O(√n) map< ll, ll > prime_factor(ll n) { map< ll, ll > ret; for(ll i = 2; i * i <= n; i++) { while(n % i == 0) { ret[i]++; n /= i; } } if(n != 1) ret[n] = 1; return ret; } // */ /* ll modpow(ll x, ll n, ll mod){ while(n){ ll resu = 1; if(n&1)res = (res * x) %mod; x = (x*x)%mod; n>>=1; } return res; } */ ///* //最小二乗法 //aのb乗をmで割ったあまりを返す関数 //変数aはa^1→a^2→a^4→a^8→…と変化 ll power(ll a,ll b, ll m){ ll p = a,ans = 1; rep(i,60){ ll wari = (1LL< bool next_combination(const T first, const T last, int k) { const T subset = first + k; // empty container | k = 0 | k == n if (first == last || first == subset || last == subset) { return false; } T src = subset; while (first != src) { src--; if (*src < *(last - 1)) { T dest = subset; while (*src >= *dest) { dest++; } iter_swap(src, dest); rotate(src + 1, dest + 1, last); rotate(subset, subset + (last - dest) - 1, last); return true; } } // restore rotate(first, subset, last); return false; } // */ int ctoi(char c){ if(c>='0' and c<='9')return c-'0'; else return -inf; } char touplo(char c){ char ret=c; ret^=32; return ret; } //vector dx = {1,0,-1,0,1,-1,-1,1}; //vector dy = {0,1,0,-1,1,1,-1,-1}; //時計回り int clx[4] = { 0, 1, 0, -1}, cly[4] = { -1, 0, 1, 0 }; //反時計回り int cclx[4] = { 0, -1, 0, 1}, ccly[4] = { -1, 0, 1, 0 }; int dx[8] = { 0, 1, 0, -1, 1, 1, -1, -1 }, dy[8] = { 1, 0, -1, 0, 1, -1, 1, -1 }; // int dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={1,1,0,-1,-1,-1,0,1}; //#define mod 998244353 //cout << mint.val() << endl; //cout << fixed << setprecision(15) << y << endl; P mima(int a,int b){ P ret; ret=make_pair(min(a,b),max(a,b)); return ret; } //bit s に i番目のビットを立てる #define bittate(s,i) (s|(1LL<>i)&1LL)return true; else return false; } //string str(bitset<32>(value).to_string, allocator >()); #define ppc(n) __popcount(n) string lltobin(ll n){ string re((bitset<61>(n).to_string, allocator >())); return re; } ll bintoll(string s){ ll re=stoll(s,nullptr,2); return re; } //-1なら外れてる、それ以外なら座標を1次元に変換 ll kabe_check(ll i,ll j,ll h,ll w){ if((i<0 or h<=i or j<0 or w<=j))return -1; else return i*w+j; } #define yes "Yes" #define no "No" #define Yes "YES" #define No "NO" #include namespace geometry{ using ld=long double; using point=complex; const ld eps=1e-9; const ld PI=acos(ld(-1)); inline bool equal(const ld &a,const ld &b){ return fabs(a-b)eps)return 1; //時計回りのときー>-1 if(cross(b,c)<-eps)return -1; //c,a,bがこの順で同一直線上にあるとき if(dot(b,c)<0)return 2; //a,b,cがこの順で同一直線上にあるとき if(norm(b)c1.r+c2.r+eps)return 4; //外接しているとき if(equal(d,c1.r+c2.r))return 3; //内接しているとき if(equal(d,abs(c1.r-c2.r)))return 1; //内包しているとき if(d crossPoint(const circle &c1, const circle &c2){ vectorret; int mode=isIntersect(c1,c2); //2円の中心間のキョリ ld d=abs(c1.p-c2.p); //2円が離れているとき if(mode==4)return ret; //一方の円が他方の円に内包されているとき if(mode==0)return ret; //2円が外接するとき if(mode==3){ ld t=c1.r/(c1.r+c2.r); ret.emplace_back(c1.p+(c2.p-c1.p)*t); return ret; } //内接しているとき if(mode==1){ if(c2.r crossPoint(const circle &c, const Line &l){ vector ret; ld d=distanceBetweenLineAndPoint(l,c.p); //交点を持たない if(d>c.r+eps)return ret; //接する point h=projection(l,c.p); if(equal(d,c.r)){ ret.emplace_back(h); return ret; } point e=unitVector(l.b-l.a); ld ph=sqrt(c.r*c.r-d*d); ret.emplace_back(h-e*ph); ret.emplace_back(h+e*ph); return ret; } //点pを通る円cの接線 //2本あるので接点のみを返す vector tangentToCircle(const point &p, const circle &c){ return crossPoint(c,circle(p,sqrt(norm(c.p-p)-c.r*c.r))); } //円の共通接線 vector tangent(const circle &a, const circle &b){ vectorret; //2円の中心間のキョリ ld g=abs(a.p-b.p); if(equal(g,0))return ret; point u=unitVector(b.p-a.p); point v=rotate(u,PI/2); for(int s : {-1,1}){ ld h=(a.r+b.r*s)/g; if(equal(h*h,1)){ ret.emplace_back(a.p+(h>0 ? u:-u)*a.r, a.p+(h>0 ? u:-u)*a.r+v); }else if(1-h*h>0){ point U=u*h,W=v*sqrt(1-h*h); ret.emplace_back(a.p+(U+W)*a.r, b.p-(U+W)*(b.r*s)); ret.emplace_back(a.p+(U-W)*a.r, b.p-(U-W)*(b.r*s)); } } return ret; } //多角形の面積を求める ld polygonArea(const vector &p){ ld ret=0; int n=p.size(); for(int i=0; i &p){ int n=p.size(); int now,pre,nxt; for(int i=0;i ConvexHull(vector p){ int n=(int)p.size(),k=0; sort(p.begin(),p.end(),[](const point &a, const point &b){ return (a.real()!=b.real() ? a.real() ch(2*n); //一直線上の3点を含める->((=2 and cross(ch[k-1]-ch[k-2],p[i]-ch[k-1])=0;ch[k++]=p[i--]){ while(k>=t and cross(ch[k-1]-ch[k-2],p[i]-ch[k-1]) &g, const point &p){ bool in =false; int n=(int)g.size(); for(int i=0;iimag(b))swap(a,b); if(imag(a)<=eps and eps convexCut(vector p, Line l){ vector ret; int sz=(int)p.size(); for(int i=0;i> n; vector p(n); rep(i,n){ int a,b; cin >> a >> b; p[i].real(a); p[i].imag(b); } auto e=ConvexHull(p); if(e.size()==n)cout << yes << endl; else cout << no << endl; }