Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <algorithm>
- #include <string>
- #include <stack>
- #include <set>
- #include <map>
- #define pii pair <int,int>
- #define pld pair <long double, long double>
- #define vec vector
- using namespace std;
- using ll = long long;
- using ld = long double;
- using db = double;
- void cv(vector <int> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvl(vector <ll> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvv(vector <vector <int> > &v){
- for (auto x: v) cv(x);
- cout<<"\n";
- }
- void cvb(vector <bool> v){
- for (bool x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvs(vector <string> v){
- for (auto a: v){
- cout<<a<<"\n";
- }
- }
- bool eq(ld x, ld y){//equal
- return fabs(x - y) < 0.01;
- }
- struct Rvec{
- ld x, y;
- void mk(Rvec a, Rvec b){//ab
- x = b.x - a.x;
- y = b.y - a.y;
- }
- void sh(){
- cout<<x<<' '<<y<<"\n";
- }
- ld len(){
- return sqrtl( powl(x,2) + powl(y,2) );
- }
- };
- ld vpr(Rvec a, Rvec b){//vector product
- return a.x * b.y - a.y * b.x;
- }
- int sgn(ld x){
- if (x < 0){
- return -1;
- }
- else if (x==0.0)return 0;
- return 1;
- }
- /*
- Есть отрезки AB, CD
- 1.Проверяем, что C и D лежат по разные стороны от AB.
- Берем векторные произведения :
- 1)AC * AB
- 2)AD * AB
- сравниваем знаки -- если по разные стороны, то зрнаки различаются
- 2.Проверяем, что A и B лежат по разные стороны от CD
- Берем векторные произведения :
- 1)CA * CD
- 2)CB * CD
- сравниваем знаки -- если по разные стороны, то знаки различаются
- Если условия 1 и 2 выполнились, то отрезки пересекаются.
- Если зоть одно не выполнилось -- то НЕ ПЕРЕСЕКАЮТСЯ
- */
- bool inter(Rvec A, Rvec B, Rvec C, Rvec D){//AB with CD
- Rvec AB,AC,AD;
- bool a=0,b=0;
- AB.mk(A,B);
- AC.mk(A,C);
- AD.mk(A,D);
- if (sgn( vpr(AB, AC) ) != sgn( vpr(AB, AD) )){
- a=1;
- }
- Rvec CD, CA, CB;
- CD.mk(C, D);
- CA.mk(C, A);
- CB.mk(C, B);
- if (sgn(vpr(CD, CA)) != sgn(vpr(CD, CB))){
- b=1;
- }
- return a&&b;
- }
- ld dst(Rvec a, Rvec b){
- return sqrtl ( powl((a.x - b.x), 2) + powl((a.y - b.y), 2) );
- }
- bool in(Rvec A, Rvec B, Rvec C){//A принадлежит BC?
- Rvec BC; BC.mk(B,C);
- /*cout<<"A:\n";
- A.sh();
- cout<<"B C:\n";
- B.sh();
- C.sh();
- cout<<"dst(A, B) + dst(A, C) = "<<dst(A, B) + dst(A, C)<<"\n";
- cout<<"BC.len() = "<<BC.len()<<"\n";*/
- if (eq( dst(A, B) + dst(A, C) , BC.len())) {
- return 1;
- }
- return 0;
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cout.precision(4);
- Rvec A,B;//B -- произвольная точка
- int n;
- cin>>n>>A.x>>A.y;
- B = {A.x + 1e3, A.y + 1e1};
- /*cout<<"A B\n";
- A.sh();
- B.sh();*/
- vector <Rvec> v(n);
- bool inv=0;
- for (int i = 0; i < n; ++i){
- cin>>v[i].x>>v[i].y;
- if (v[i].x == A.x && v[i].y == A.y ){
- inv=1;
- //cout<<"INV\n";
- }
- }
- if (inv){
- cout<<"YES\n";
- exit(0);
- }
- int cnt=0;
- if (inter(A,B, v[n-1], v[0])){
- cnt++;
- }
- /*cout<<"check IN sect\n";
- v[n-1].sh();
- v[0].sh();*/
- if (in(A, v[n-1], v[0])){
- cout<<"YES\n";
- exit(0);
- }
- //cout<<"check\n";
- for (int i = 1; i < n ;++i){
- if (inter(A,B, v[i-1], v[i])){
- cnt++;
- /* v[i-1].sh();
- v[i].sh();
- cout<<"\n"; */
- }
- /*cout<<"check IN sect\n";
- v[i-1].sh();
- v[i].sh();*/
- if (in(A, v[i-1], v[i])){
- cout<<"YES\n";
- exit(0);
- }
- }
- //cout<<"cnt = "<<cnt<<"\n";
- if (cnt % 2 == 1){
- cout<<"YES\n";
- }
- else{
- cout<<"NO\n";
- }
- }//+ проверить принадлежность точки отрезку
- /*
- 3 2 3
- 1 1
- 10 2
- 2 8
- 3 2 3
- 1 1
- 10 2
- -10 100
- 4 0 0
- 0 0
- 4 8
- 10 0
- 6 2
- 5 10 0.1
- 4 8
- 11 0
- 8 0
- 6 2
- 0 0
- */
Add Comment
Please, Sign In to add comment