CF13B手紙A
タイトル説明
リトルペチャは書く方法を学習します。教師は生徒に手紙書くためのタスク与えたA紙のシート上に。ペチャが本当に手紙書いていたかどうかをチェックするために必要とされるAを。
あなたは平面上に3つのセグメントを与えられています。彼らは、手紙形成Aを以下の条件が保持している場合:
- 第3のセグメントは、異なるセグメント上の2点を接続している2つのセグメントが、(第1及び第2のこれらのセグメントを呼び出すことができ)、共通のエンドポイントを持っています。
- 第1および第2のセグメントとの間の角度は00より大きく、9090度を超えません。
- 第3のセグメントは1/41/4よりも小さくない割合の最初の2つのセグメント(すなわち、最も長い部分の長さと最短部の長さの比が1/41/4以上である)のそれぞれを分割します。
入力形式
最初の行は1つの整数のT含まT(1 <= T <= 100001 <= T <= 10000) -テストケースの数を解決します。各ケースは3行で構成されます。セグメントの一方の端点の座標-これら三つのラインのそれぞれは、4つのスペースで区切られた整数を含みます。全ての座標は絶対値で10 ^ {8} 108を超えません。すべてのセグメントは、正の長さを持っています。
出力フォーマット
各テストケース用の出力一行。印刷(引用符なし)«YES»、セグメントが手紙形成している場合A «NO»そうでない場合とを。
問題の意味の翻訳
共通のエンドポイントと「A」決意条件1項2つの線分(我々は、最初の二行目それらを呼ぶ)と、第3の文字かどうかを決定三つのセグメント、三つのセグメント所与セグメントエンドポイントは二つのセグメントが異なります。前記第1の線分と第二との間の角度は約90度、0度より大きくなければなりません。大きい長さと他の2つの線分の線分の短い長さの比が3条1/4よりも大きくなければならない傍受しました。入力:三行データの組の各動作後の最初の行の整数T、3 * tの、3つの線分を表す、各ラインは両端点出力の線分の座標で表されるデータの各セットについて、出力「YES」であればそれ以外の場合は出力「NO」感謝の翻訳@探偵女性を提示申し出を希釈し、「A」で構成することができます。
サンプル入力と出力
入力#1コピー
出力#1コピー
ソリューション:
このTacca初の黒人の生活の問題
いくつかの約束をドープした複雑なシミュレーションスタイル計算幾何学。
実際には、関係する幾何学計算は、同一直線上に決まる角度が90°未満であると判断し、線分は、差動比未満で判定され、解析幾何学の少しだけである\(\ FRAC。1 {{}}。4 \) 。
クロス製品を使用して90°未満の角度を求めている場合は、平面ベクトルの知識を持っている必要があり、学生は自分自身のBaiduのを理解していません。
比較判断嫌差比未満である\(\ FRAC。1 {{}}。4 \) 。私はについて話しましょう-
まあ、それはアイデアは非常に簡単ですシミュレートするためのコードを見て、話すことはありません、私たちは、接続が遅くなると信じています。
コード:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
int x,y,j,k;
}a[10];
int t,x,y,m,n,p,q,x1,yy,x2,y2,c1,c2,flag;
int check_oneline(int a,int b,int c,int d,int e,int f)
{
if((ll)(f-b)*(c-a)==(ll)(d-b)*(e-a))
return 1;
return 0;
}
int check_angle(int x,int y,int a,int b,int p,int q)
{
if((ll)(a-x)*(p-x)+(ll)(b-y)*(q-y)<0)
return 0;
return 1;
}
int check_subseg(int x,int y,int m,int n,int a,int b)
{
if(x!=a)
{
if(a>x)
{
if((a-x)*5<(m-x))
return 0;
if((a-x)*5>(m-x)*4)
return 0;
return 1;
}
else
{
if((x-a)*5<(x-m))
return 0;
if((x-a)*5>(x-m)*4)
return 0;
return 1;
}
}
else
{
if(b>y)
{
if((b-y)*5<(n-y))
return 0;
if((b-y)*5>(n-y)*4)
return 0;
return 1;
}
else
{
if((y-b)*5<(y-n))
return 0;
if((y-b)*5>(y-n)*4)
return 0;
return 1;
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=3;i++)
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].j,&a[i].k);
for(int i=1;i<=2;i++)
for(int j=i+1;j<=3;j++)
{
if(a[i].x==a[j].x&&a[i].y==a[j].y)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
else if(a[i].x==a[j].j&&a[i].y==a[j].k)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].j&&a[i].k==a[j].k)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].x&&a[i].k==a[j].y)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
}
for(int i=1;i<=3;i++)
if(i!=c1&&i!=c2)
{
x1=a[i].x,yy=a[i].y,x2=a[i].j,y2=a[i].k;
break;
}
flag=1;
if(check_angle(x,y,m,n,p,q)==0)
flag=0;
if(flag)
{
if(check_oneline(x,y,m,n,x1,yy)&&check_oneline(x,y,p,q,x2,y2))
{
if(check_subseg(x,y,m,n,x1,yy)==0)
flag=0;
if(check_subseg(x,y,p,q,x2,y2)==0)
flag=0;
}
else if(check_oneline(x,y,p,q,x1,yy)&&check_oneline(x,y,m,n,x2,y2))
{
if(check_subseg(x,y,m,n,x2,y2)==0)
flag=0;
if(check_subseg(x,y,p,q,x1,yy)==0)
flag=0;
}
else
flag=0;
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}