zoukankan      html  css  js  c++  java
  • Codeforces 994 C

    C - Two Squares

    思路:

    点积叉积应用

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define pi acos(-1.0)
    #define LL long long
    #define mp make_pair
    #define pb push_back
    #define ls rt<<1, l, m
    #define rs rt<<1|1, m+1, r
    #define ULL unsigned LL
    #define pll pair<LL, LL>
    #define pii pair<int, int>
    #define piii pair<int,pii>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
    //head
    
    struct P {
        double x, y;
        P(){}
        P(double x, double y):x(x), y(y) {}
        P operator - (P p) {
            return P(x-p.x, y-p.y);
        }
        double cross(P p) {
            return x*p.y - y*p.x;
        }
        double dot(P p) {
            return x*p.x + y*p.y;
        }
    };
    typedef P Vector;
    bool on_seg(P p, Vector a, Vector b) {
        if((a-p).cross(b-p) == 0 && (a-p).dot(b-p) <= 0) return true;
        else return false;
    }
    double area2(Vector a, Vector b, Vector c) {
        return (b-a).cross(c-a);
    }
    bool intersect(Vector a, Vector b, Vector c, Vector d) {
        if(area2(a, c, d) == 0 && area2(b, c, d) == 0 && !on_seg(a, c, d) && !on_seg(b, c, d)
            || area2(a, c, d) * area2(b, c, d) > 0
            || area2(c, a, b) * area2(d, a, b) > 0
        ) return false;
        else return true;
    }
    pii a[4], b[4];
    int main() {
        for (int i = 0; i < 4; i++) scanf("%d %d", &a[i].fi, &a[i].se);
        for (int i = 0; i < 4; i++) scanf("%d %d", &b[i].fi, &b[i].se);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                Vector aa(a[i].fi, a[i].se);
                Vector bb(a[(i+1)%4].fi, a[(i+1)%4].se);
                Vector c(b[j].fi, b[j].se);
                Vector d(b[(j+1)%4].fi, b[(j+1)%4].se);
                if(intersect(aa, bb, c, d)) return 0*puts("YES");
            }
        }
        for (int i = 0; i < 4; i++) {
            int x = 0, y = 0, xx = 0, yy = 0;
            for (int j = 0; j < 4; j++) {
                Vector A(a[i].fi, a[i].se), B(b[j].fi, b[j].se), C(b[(j+1)%4].fi, b[(j+1)%4].se);
                if(area2(A, B, C) > 0) x++;
                else if(area2(A, B, C) < 0)y++;
                else x++, y++;
                Vector AA(b[i].fi, b[i].se), BB(a[j].fi, a[j].se), CC(a[(j+1)%4].fi, a[(j+1)%4].se);
                if(area2(AA, BB, CC) > 0) xx++;
                else if(area2(AA, BB, CC) < 0) yy++;
                else xx++, yy++;
            }
            if(x == 4 || y == 4 || xx == 4 || yy == 4) return 0*puts("YES");
        }
        puts("NO");
        return 0;
    }
  • 相关阅读:
    《Advanced Bash-scripting Guide》学习(四):一个显示时间日期登录用户的脚本
    《Advanced Bash-scripting Guide》学习(三):自删除脚本和自读取内容的脚本
    51nod 1005 大数加法
    51nod1019 逆序数
    scoi2010 幸运数字
    COGS 513 八
    [HNOI2006]超级英雄Hero
    NOIP2010 关押罪犯
    [Scoi2010]游戏
    bzoj 2820: YY的GCD
  • 原文地址:https://www.cnblogs.com/widsom/p/9277678.html
Copyright © 2011-2022 走看看