Codeforces Round #432 Div2 B. Arpa and an exam about geometry

B. Arpa and an exam about geometry
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Arpa is taking a geometry exam. Here is the last problem of the exam.

You are given three points a, b, c.

Find a point and an angle such that if we rotate the page around the point by the angle, the new position of a is the same as the old position of b, and the new position of b is the same as the old position of c.

Arpa is doubting if the problem has a solution or not (i.e. if there exists a point and an angle satisfying the condition). Help Arpa determine if the question has a solution or not.

Input
The only line contains six integers ax, ay, bx, by, cx, cy (|ax|, |ay|, |bx|, |by|, |cx|, |cy| ≤ 109). It’s guaranteed that the points are distinct.

Output
Print “Yes” if the problem has a solution, “No” otherwise.

You can print each letter in any case (upper or lower).

Examples
input
0 1 1 1 1 0
output
Yes
input
1 1 0 0 1000 1000
output
No
Note
In the first sample test, rotate the page around (0.5, 0.5) by .

In the second sample test, you can’t find any solution.


题目意思就是给出a,b,c三个点的坐标,然后绕着某个点旋转问是否能够a点变成b点,b点变成c点。若能输出Yes,否则输出No。
思路:判断三个点是否在一条直线上,若在一条直线上则不能。再判断a到b点的距离是否和b和c点的相等,若相等且不在一条直线上则可以。
40的数据:
0 0 1000000000 1 1000000000 -999999999
输出No.
需要注意的一点为需要用long long int 。一开始用的double精度不够过不了。
其他一些数据:

589824 196608 262144 196608 0 0
输出 Yes.
999999999 1000000000 0 0 -1000000000 -999999999
输出 Yes.

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<iostream>
using namespace std;
int main()
{
    long long int  ax,ay,bx,by,cx,cy;
    scanf("%lld%lld%lld%lld%lld%lld",&ax,&ay,&bx,&by,&cx,&cy);
    long long int  l1=((by-ay)*(by-ay)+(bx-ax)*(bx-ax));
    long long int  l2=((cy-by)*(cy-by)+(cx-bx)*(cx-bx));
    int mark=0;
//  printf("l1=%lf,l2=%lf\n",l1,l2);
//  printf("by-ay=%lf\n",by-ay);
    if((ax==bx&&ax==cx)||(ay==by&&ay==cy))
    mark=1;
    else 
    {
        double k1=(by-ay)*1.0/(bx-ax);
        double k2=(cy-by)*1.0/(cx-bx);
        if(k1==k2)
        mark=1;
    }
//  printf("%d\n",mark);
    if(!mark&&l1==l2)
    printf("Yes\n");
    else
    printf("No\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值