Brief Intro:

给3条相同长度的边的中点,问是否存在一个严格凸四边形

Algorithm:

明显只要求出一个点就能利用对称性算出其他点的坐标

设中点K,L,M分别在边AB,BC,CD上,易知B、C分别在KL、LM的垂直平分线上

但仍需一个点才能确定B点的位置

于是我们想办法将现有的信息整合:做M关于L的对称点M’,从而发现M’B=KB=LB

接下来手算出KL、LM’的垂直平分线的直线方程

((b1c2-b2c1)/(a1b2-a2b1),(a2c1-a1c2)/(a1b2-a2b1))求出交点即可

注意:求完4个点后,仍要判断正确性(是否为凸四边形)

判断顺时针的4个三角形方向是否相同(叉积的正负性是否相同)

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second const double eps=1e-;
typedef pair<double,double> P;
int T;
P a,b,c; double Cross(P a,P b,P c)
{
return (a.X*b.Y+b.X*c.Y+c.X*a.Y)-(b.X*a.Y+c.X*b.Y+a.X*c.Y);
} inline int Read()
{
char ch;int num,f=;
while(!isdigit(ch=getchar())) f|=(ch=='-');
num=ch-'';
while(isdigit(ch=getchar())) num=num*+ch-'';
return f?-num:num;
} P read()
{
P t;t.X=Read();t.Y=Read();
return t;
} bool check(P x,P y,P z)
{
double A0=*(x.X-y.X),A1=*(y.X-z.X);
double B0=*(x.Y-y.Y),B1=*(y.Y-z.Y);
double C0=y.X*y.X-x.X*x.X+y.Y*y.Y-x.Y*x.Y;
double C1=-*(y.X*y.X+y.Y*y.Y)-(z.X*z.X+z.Y*z.Y)+*(y.X*z.X+y.Y*z.Y); P A,B,C,D;
A.X=(B0*C1-B1*C0)/(A0*B1-A1*B0);A.Y=(A1*C0-A0*C1)/(A0*B1-A1*B0);
B.X=*y.X-A.X;B.Y=*y.Y-A.Y;
C.X=*x.X-A.X;C.Y=*x.Y-A.Y;
D.X=*z.X-B.X;D.Y=*z.Y-B.Y; double P1=Cross(C,A,B),P2=Cross(A,B,D),P3=Cross(B,D,C),P4=Cross(D,C,A); //判断方向 if((P1> && P2> && P3> && P4>) || (P1< && P2< && P3< && P4<))
{
printf("YES\n");
printf("%0.10lf %0.10lf ",A.X,A.Y);
printf("%0.10lf %0.10lf ",B.X,B.Y);
printf("%0.10lf %0.10lf ",D.X,D.Y);
printf("%0.10lf %0.10lf\n",C.X,C.Y);
return true;
}
return false;
} bool solve()
{
if(Cross(a,b,c) && (check(a,b,c) || check(c,a,b) || check(b,c,a)))
return true;
return false;
} int main()
{
scanf("%d",&T); while(T--)
{
a=read();b=read();c=read();
if(!solve()) printf("NO\n\n");
}
return ;
}

Review

1、对凸四边形的判断:

顺时针旋转的每个三角形叉积的正负性是否相同

2、学会利用对称点的方式整合信息

[Codeforces 23D] Tetragon的更多相关文章

  1. Educational Codeforces Round 23D

    给n个数求每个子区间的价值,区间的价值是最大值-最小值 套路题= =,分别算最大值和最小值的贡献,用并查集维护,把相邻点连一条边,然后sort,求最大是按边价值(两个点的最大价值)小的排,求最小是按最 ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. POJ1087:A Plug for UNIX(最大流)

    A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...

  2. Hbase写入量大导致region过大无法split问题

    最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region ...

  3. nginx对指定目录做代理

    环境介绍 web1,作为前端端服务器,访问地址是http://192.168.1.1,要将http://192.168.1.1/bbs的请求交给web2.在web1的网站根目录下并没有bbs目录 we ...

  4. js和jquery修改背景颜色的区别

    html: <HTML> <head> <meta http-equiv="content-type" content="text/html ...

  5. 有关eclipse的内存溢出问题

    一:前言 最近在做的项目在启动tomcat时就报“内存溢出的错误”,其实也不是自己第一次遇到,但是每次都是在网上查询后敲进去,所以这次我觉得自己记载下来吧. 二:内容 我自己的配置大小,这里的配置位置 ...

  6. bzoj3786 星际探索 splay dfs序

    这道题 首先 因为他求的是当前点到根节点的路径和 我们可以将题目转换为括号序列的写法 将点拆为左括号以及右括号 左括号为正 右括号为负 这样题目就变为了求前缀和了 如果一个点是这个点的子树 那么他的左 ...

  7. codechef T3 计算器

    CALC: 计算器题目描述 大厨有一个计算器,计算器上有两个屏幕和两个按钮.初始时每个屏幕上显示的都是 0.没按 一次第一个按钮,就会让第一个屏幕上显示的数字加 1,同时消耗 1 单位的能量. 每按一 ...

  8. 51nod K 汽油补给 大根堆+小根堆....

    题目传送门 用优先队列瞎搞... 想着在每个地方 先算上一个点到这一个点要花费多少钱 这个用小根堆算就好 然后在这个地方加油 把油钱比自己多的替代掉 这个用大根堆维护一下 然后两个堆之间信息要保持互通 ...

  9. bzoj 1002 找规律(基尔霍夫矩阵)

    网上说的是什么基尔霍夫矩阵,没学过这个,打个表找下规律,发现 w[i]=3*w[i-1]-w[i-2]+2; 然后写个高精直接递推就行了 //By BLADEVIL var n :longint; a ...

  10. 中断处理函数中不用disable_irq而用disable_irq_nosync原因【转】

    转自:http://blog.csdn.net/beyondioi/article/details/9201695 今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现在进入中断处 ...