BZOJ3621: 我想那还真是令人高兴啊 复数运算

原创 2017年01月03日 16:23:56

题意:给出一对三角形,已知其中一个是由另一个绕某一点旋转放缩而得到,求这个点的坐标。每个测试点有T(<=10)组数据。
一开始以为是计算几何,然而向量的旋转和放缩是两种操作,复数却可以一步完成。
对于复数a和b,a*b的几何意义为a与b长度相乘,极角相加。
那么本题就可以看成从旋转点出发,指向其中一个三角形顶点的三个复数向量乘以同一个复数后变成了从旋转点出发,指向另一个三角形顶点的三个复数向量。设出旋转点坐标和同乘的复数,枚举顶点的六种可能对应关系。列出三个方程,用前两个方程解出解,代到第三个方程中检验是否正确即可。
解方程需要用到复数除法。对于(a+bi)/(c+di),分子分母同乘(c-di)可进行分母有理化,
整理得结果为((ac+bd)/(cc+dd))+((bc-ad)/(cc+dd))i。
然而复数除法非常掉精度,取eps=1e-5都会WA,要1e-4才能过。。。

#include<cstdio>
#include<cmath>
using namespace std;
#define y1 __y__
struct cpx
{
    double a,b;
    cpx(const double &a=0,const double &b=0):a(a),b(b){}
    cpx(FILE* f){fscanf(f,"%lf%lf",&a,&b);}
    #define c ano.a
    #define d ano.b
    inline cpx operator + (const cpx &ano) const
    {return cpx(a+c,b+d);}
    inline cpx operator - (const cpx &ano) const
    {return cpx(a-c,b-d);}
    inline cpx operator * (const cpx &ano) const
    {return cpx(a*c-b*d,a*d+b*c);}
    inline cpx operator / (const cpx &ano) const
    {
        double temp=c*c+d*d;
        return cpx((a*c+b*d)/temp,(b*c-a*d)/temp);
    }
    inline bool operator == (const cpx &ano) const
    {return fabs(a-c)<1e-4&&fabs(b-d)<1e-4;}
    inline void operator() (FILE* f){fprintf(f,"%lf %lf\n",a,b);}
}ans,a1,a2,a3;
int t;
inline bool check(const cpx &b1,const cpx &b2,const cpx &b3)
{
    cpx __t=(b1-b2)/(a1-a2);
    ans=(a1*__t-b1)/(__t-cpx(1.0,0.0));
    return (a3-ans)*__t==(b3-ans);
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        a1=stdin,a2=stdin,a3=stdin;
        cpx b1(stdin),b2(stdin),b3(stdin);
        if(check(b1,b2,b3)) goto successed_to_match;
        if(check(b1,b3,b2)) goto successed_to_match;
        if(check(b2,b1,b3)) goto successed_to_match;
        if(check(b2,b3,b1)) goto successed_to_match;
        if(check(b3,b1,b2)) goto successed_to_match;
        if(check(b3,b2,b1)) goto successed_to_match;
        successed_to_match:
        ans(stdout);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[数学 复数] BZOJ 3621 我想那还真是令人高兴啊

%%%PoPoQQQ:http://blog.csdn.net/popoqqq/article/details/44346555 “首先两个复数相乘的几何意义是【极角相加,长度相乘】 这两种...
  • u014609452
  • u014609452
  • 2016年03月20日 19:47
  • 485

BZOJ 3621 我想那还真是令人高兴啊 复数

题目大意:给定两个三角形,其中一个可以通过以某点为中心旋转并放缩的方式得到另一个,求这个中心 それはとっても嬉しいなって。 首先两个复数相乘的几何意义是【极角相加,长度相乘】 这两种变换正好对应旋...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年03月17日 19:34
  • 1371

BZOJ 3621 我想那还真是令人高兴啊 复数

题目大意:给定两个三角形,其中一个可以通过以某点为中心旋转并放缩的方式得到另一个,求这个中心 それはとっても嬉しいなって。 首先两个复数相乘的几何意义是【极角相加,长度相乘】 这两种变换正好对应旋...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年03月17日 19:34
  • 1371

[数学 复数] BZOJ 3621 我想那还真是令人高兴啊

%%%PoPoQQQ:http://blog.csdn.net/popoqqq/article/details/44346555 “首先两个复数相乘的几何意义是【极角相加,长度相乘】 这两种...
  • u014609452
  • u014609452
  • 2016年03月20日 19:47
  • 485

真是O(1)吗?想清楚了没?

当然标题里这个O(1)可以换成任何复杂度。 话说写程序的时候我们会用到各种数据结构,但十有八九不会由我们自己从头写起,都会直接拿来用。于是很多人就会记住,譬如HashMap或Dictionary的存...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年12月21日 12:34
  • 440

整数加复数,复数加整数,

三.整数加复数,复数加整数,位置有没有特殊要求呢? Description 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。参加运算的两个运算量可以都是类对象,也可以其中...
  • u013545737
  • u013545737
  • 2014年06月11日 19:36
  • 1118

凡人修真3D(4)神装

1.for循环的iter如果不是之后特殊要求用到,千万不要提出来,要养成习惯, Message::Db::Tables::SeqTGodEquip::const_iterator it = seqTG...
  • u012175089
  • u012175089
  • 2016年11月18日 21:19
  • 2149

真是该警觉了

本来下午在学习python,在网上找关于字节码转换为字符串的函数时,遇到了阮一峰的博客http://road.ruanyifeng.com/index.html,真是受到了刺激!然后就想已经过去的一年...
  • dxbNO1
  • dxbNO1
  • 2017年06月01日 19:25
  • 139

你是想读书,还是想读完书?

以前,读书前会很想读一本书,但实际读书时,经常是“想读完书”,而不是“想读书”。这种想法经常会让我的生活变得很痛苦,当你做一件事想着快点做完时,你的心思其实已经不在这件事上了。 这个问题在我大学...
  • Caesardadi
  • Caesardadi
  • 2013年02月28日 13:20
  • 655

哲理故事三百篇

1、一只火鸡和一头牛闲聊,火鸡说:我希望能飞到树顶,可我没有勇气。牛说:为什么不吃一点我的牛粪呢,他们很有营养。火鸡吃了一点牛粪,发现它确实给了它足够的力量飞到第一根树枝,第二天,火鸡又吃了更多的牛粪...
  • qq_21792169
  • qq_21792169
  • 2015年10月15日 19:28
  • 21742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ3621: 我想那还真是令人高兴啊 复数运算
举报原因:
原因补充:

(最多只允许输入30个字)