zoukankan      html  css  js  c++  java
  • codeforces 13 b

    给你三根线段判段是否组成了A

    条件,两条线段交于端点并且夹角不大于90,第三条线段端点在两条线段上并且划分的大小满足 大:小<4:1

    注释很全。(主要是我记不清楚了,,好像过了一个多星期了)

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef long long db;
     5 int inmid(db k1,db k2,db k3){return (k1-k3)*(k2-k3)<=0;}// k3 在 [k1,k2] 内
     6 struct point{
     7     ll x,y;
     8     point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
     9     point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    10     point operator * (db k1) const{return (point){x*k1,y*k1};}
    11     point operator / (db k1) const{return (point){x/k1,y/k1};}
    12     int operator == (const point &k1) const{return x==k1.x&&y==k1.y;}
    13 };
    14 int inmid(point k1,point k2,point k3){return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);}
    15 ll cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
    16 ll dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
    17 struct line {
    18     // p[0]->p[1]
    19     point p[2];
    20     line(point k1, point k2) {p[0] = k1;p[1] = k2;}
    21     point &operator[](int k) { return p[k]; }
    22 };
    23 ll cross(line a,line b){return cross(a[1]-a[0],b[1]-b[0]);}
    24 ll dot(line a,line b){return dot(a[1]-a[0],b[1]-b[0]);}
    25 int t;point p[7];
    26 vector<line> l;
    27 bool check(ll x,ll y){if(x*5<y)return 0;if(x*5>y*4)return 0;return 1;}
    28 bool slove(line a,line b,line c){
    29     if(a[1]==b[1])swap(a[0],a[1]),swap(b[0],b[1]);
    30     if(a[1]==b[0])swap(a[0],a[1]);
    31     if(a[0]==b[1])swap(b[0],b[1]);
    32     if(!(a[0]==b[0]))return 0;//判相交
    33     if(cross(a,b)==0)return 0;//重合
    34     if(dot(a,b)<0)return 0;//夹角
    35     if(cross(a[1]-a[0],c[1]-a[0])==0&&cross(b[1]-b[0],c[0]-b[0])==0){}
    36     else swap(c[0],c[1]);
    37     if(!(cross(a[1]-a[0],c[1]-a[0])==0&&cross(b[1]-b[0],c[0]-b[0])==0))return 0;//共线
    38     if(!inmid(a[0],a[1],c[1]))return 0;//在线段上
    39     if(!inmid(b[0],b[1],c[0]))return 0;
    40     //比例
    41     if(!check(abs(a[0].x-c[1].x),abs(a[1].x-a[0].x)))return 0;
    42     if(!check(abs(a[0].y-c[1].y),abs(a[1].y-a[0].y)))return 0;
    43     if(!check(abs(b[0].x-c[0].x),abs(b[0].x-b[1].x)))return 0;
    44     if(!check(abs(b[0].y-c[0].y),abs(b[0].y-b[1].y)))return 0;
    45     return 1;
    46 }
    47 
    48 int main(){
    49     scanf("%d",&t);
    50     while(t--){
    51         l.clear();
    52         for(int i=1;i<=6;i++)scanf("%lld%lld",&p[i].x,&p[i].y);
    53         l.push_back({p[1],p[2]});l.push_back({p[3],p[4]});l.push_back({p[5],p[6]});
    54         if(slove(l[0],l[1],l[2]))cout<<"YES"<<endl;
    55         else if(slove(l[0],l[2],l[1]))cout<<"YES"<<endl;
    56         else if(slove(l[1],l[2],l[0]))cout<<"YES"<<endl;
    57         else cout<<"NO"<<endl;
    58     }
    59 }
    60 /**
    61 1
    62 0 0 0 6
    63 0 6 2 -4
    64 1 1 0 1
    65  */
    View Code
  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/MXang/p/10749603.html
Copyright © 2011-2022 走看看