题解 UVA12165 【Triangle Hazard】

· · 题解

题意

略。

题解

最近脑子不太好使,只能写点简单题。

梅涅劳斯定理。

好久没学 MO 了,写得不好请见谅。

\triangle ABD 中有:

\frac{m_5}{m_6}\cdot\frac{m_1+m_2}{m_2}\cdot\frac{DP+PR}{RA}=1

\triangle ACD 中有:

\frac{m_4}{m_3}\cdot\frac{m_1+m_2}{m_1}\cdot\frac{DP}{PR+RA}=1

\dfrac{DP+PR}{RA}=a,\dfrac{DP}{PR+RA}=b,则

\begin{cases}aRA-DP=PR\\DP-bRA=bPR\end{cases}

两式相加即 RA=\dfrac{b+1}{a-b}PR,由于 PR 已知,直接求解即可。

由于图形有对称性,所以剩下两个点的坐标可以轮换求出。这里是绝对不会出现拿 0 当除数的,因为如果 a=b 的话,即

\frac{m_5}{m_6}\cdot \frac{m_1+m_2}{m_2}=\frac{m_4}{m_3}\cdot \frac{m_1+m_2}{m_1}

\frac{m_1}{m_2}\cdot\frac{m_3}{m_4}\cdot\frac{m_5}{m_6}=1

由塞瓦定理知 AD,BE,CF 三线共点,然而这是不可能的,所以 a\neq b,大胆除就是了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
typedef long double db;
const ll MAXN=2e5+51;
ll test;
db xp,yp,xq,yq,xr,yr,m1,m2,m3,m4,m5,m6;
inline ll read()
{
    register ll num=0,neg=1;
    register char ch=getchar();
    while(!isdigit(ch)&&ch!='-')
    {
        ch=getchar();
    }
    if(ch=='-')
    {
        neg=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        num=(num<<3)+(num<<1)+(ch-'0');
        ch=getchar();
    }
    return num*neg;
}
inline db getRatio(db m1,db m2,db m3,db m4)
{
    return m2/m1*m4/(m3+m4);
}
#define P db xp,db yp
#define Q db xq,db yq
#define R db xr,db yr
inline void calc(P,Q,R,db m1,db m2,db m3,db m4,db m5,db m6)
{
    db PR=hypot(xp-xr,yp-yr),u=getRatio(m5,m6,m1,m2),v=getRatio(m4,m3,m2,m1);
    db RA=(v+1)/(u-v)*PR,dx=xr-xp,dy=yr-yp,c=RA/PR;
    printf("%.8Lf %.8Lf",xr+dx*c,yr+dy*c);
}
inline void solve()
{
    scanf("%Lf%Lf%Lf%Lf%Lf%Lf",&xp,&yp,&xq,&yq,&xr,&yr);
    scanf("%Lf%Lf%Lf%Lf%Lf%Lf",&m1,&m2,&m3,&m4,&m5,&m6);
    calc(xp,yp,xq,yq,xr,yr,m1,m2,m3,m4,m5,m6),putchar(' ');
    calc(xq,yq,xr,yr,xp,yp,m3,m4,m5,m6,m1,m2),putchar(' ');
    calc(xr,yr,xp,yp,xq,yq,m5,m6,m1,m2,m3,m4),puts("");
}
int main()
{
    test=read();
    for(register int i=0;i<test;i++)
    {
        solve();
    }
}