Description

Input

输入有多组测例,每组测例有一行,为4 个整数x1,y1, x2, y2,含义见题目描述。输入文件以EOF 结束。

Output

Sample Input

3 0 1 2
6 0 4 0

Sample Output

5
0

Data Constraint

赛时

比赛一眼没啥思路,主要是感觉感冒了,精神状态欠佳。
画画图,瞎**猜了一个神奇的结论:
当两条向量的斜率相同时,答案为0。
当两条向量不相同时,答案就是选择其中一条最短的。
感觉没啥问题,接着去死磕后面的两道毒瘤题了。
比赛即将结束,突然发现结论好像有点问题?
/<_

题解

我们看看上面我的结论哪里错了——
看到两个夹角等于120°,长度相等的向量。
那么两个向量加起来是等于向量长的。
如果把这个夹角变大点,那么长度就小于向量长了。
所以说,我们要把这类型的情况给做好!

直接上1号结论——当两向量夹角的角度大于60°时,即可利用我的结论。
否则就看到2号结论,再搞搞事情。

证明1号结论:

我直接截取论文上的证明了,还是很好推的(话说论文一开始写错了,那个等于号应该是大于等于)

然后我们来看看2号结论:
\(|ax+by|=|a(x-\lambda y)+(b+a\lambda)y|\),即向量\((x,y)\)可以转换成\((x-\lambda y,y)\),且系数\((a,b)\)可以转换成系数\((a,b+a\lambda)\)
证明显然。
由于系数这个东西是自己随意确定的。
所以,向量就可以利用上面的东西变成新的向量,同时扩大夹角。
因此在不停地扩大的过程中,夹角也最终会大于60°,回到结论1即可。

那么我们来看看具体如何扩大:
还是论文的图

我们设\(\overrightarrow {OE}\)为\(\overrightarrow {OB}\)在\(\overrightarrow {OA}\)上的投影。
那么接下来有3种情况:

1、\(|\overrightarrow {OA}|<|\overrightarrow {OE}|\)
在这种情况下,也就是上面的图,考虑转化。
设\(\overrightarrow {OC}=\lambda*\overrightarrow {OA}\)并且其中的\(\lambda\)在满足\(|\overrightarrow {OC}|<|\overrightarrow {OE}|\)的情况下\(\lambda\)最大。
那么现在就可以转化啦。
显然,\(\angle{DCB}>\angle{AOB}\)
于是我们就把\((\overrightarrow {CB},\overrightarrow {OA})\)代入,继续递归。

2、\(|\overrightarrow {OA}|>|\overrightarrow {OE}|\)
也就是类似于上面的\(\overrightarrow {OD}\)
我们发现,\(\angle{ADB}>\angle{AOB}\),证明的话把D按照E轴对称折叠过去,发现是外角。
把\((\overrightarrow {DB},\overrightarrow {OA})\)代入,递归!

3、\(|\overrightarrow {OA}|=|\overrightarrow {OE}|\)
其实这种情况注意一下即可,写得不正确有可能会死循环。

大致就是这样子,是不是很像gcd算法的过程?这就叫做类欧几里得算法。
一些小细节:

  • 如何快速求\(\lambda\)呢?
    \(\lambda=\lfloor \frac{|\overrightarrow {OE}|}{|\overrightarrow {OA}|}\rfloor\)
  • 当递归后夹角大于90°,一样要把一条向量旋转180°。
  • 时间复杂度:因为有了上面这条,所以时间复杂度证明变得极其复杂。(其实是我太蔡了)

标程

uses math;
typenod=recordx,y:extended;end;vari,j,k,l,n,m,anss:longint;co,kk:extended;a,b,c:nod;function jia(a,b:nod):nod;
beginjia.x:=a.x+b.x;jia.y:=a.y+b.y;
end;function jian(a,b:nod):nod;
beginjian.x:=a.x-b.x;jian.y:=a.y-b.y;
end;function cheng(lid:extended;a:nod):nod;
begincheng.x:=lid*a.x;cheng.y:=lid*a.y;
end;function cross(a,b:nod):extended;
beginexit(a.x*b.x+a.y*b.y);
end;function dis(a:nod):extended;
beginexit(sqrt(a.x*a.x+a.y*a.y));
end;function ans(a:nod):extended;
beginexit(a.x*a.x+a.y*a.y);
end;function likegcd(a,b:nod):extended;
varc:nod;det,k:extended;
beginif (dis(a)>dis(b)) thenbeginc:=a;a:=b;b:=c;end;if (dis(a)=0) thenbeginexit(0);end;if (dis(b)=0) thenbeginexit(0);end;co:=cross(a,b)/(dis(a)*dis(b));if (co<0) thenbegina.x:=-a.x;a.y:=-a.y;exit(likegcd(a,b));end;if (co=1) thenbeginexit(0);end;c.x:=b.x*co;c.y:=b.y*co;kk:=pi;if (co<=1/2) thenbeginif (dis(a)>dis(b)) then exit(ans(b))else exit(ans(a));end;if (dis(a)>dis(c)) thenbeginexit(likegcd(jian(b,a),a));endelsebegink:=trunc(dis(c)/dis(a));exit(likegcd(jian(b,cheng(k,a)),a));end;
end;beginassign(input,'math.in');reset(input);assign(output,'math.out');rewrite(output);while not eof dobeginreadln(a.x,a.y,b.x,b.y);c.x:=-a.x;c.y:=-a.y;if dis(jia(c,b))>dis(jia(a,b)) then a:=c;anss:=trunc(likegcd(a,b));writeln(anss);if anss=5584 theni:=i;end;
end.

转载于:https://www.cnblogs.com/RainbowCrown/p/11333812.html

jzoj3736. 【NOI2014模拟7.11】数学题相关推荐

  1. jzoj3736-[NOI2014模拟7.11]数学题(math)【计算几何】

    正题 题目大意 给定两个向量a=(x1,y1),b=(x2,y2)a=(x_1,y_1),b=(x_2,y_2)a=(x1​,y1​),b=(x2​,y2​),然后求∣λ1a+λ2b∣|\lambda ...

  2. C语言模拟11答案,C语言模拟试题11答案.doc

    C语言模拟试题11答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  3. 备战Noip2018模拟赛11(B组)T4 Path 好路线

    10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...

  4. NOIP2018 模拟 9.11

    ISIJ 2018 很多序列(Training Round D4T3) 题目名称:很多序列 文件名:sequences.in / sequences.out 题目描述 假设 $ x_1 < x_ ...

  5. noip模拟题11.5

    T1 大天使之剑 [问题描述] 小A在游戏⾥打怪.有⼀次,他⼀下⼦遇到了n个怪物. 每个怪物有一个生命值,第i个怪物的生命值是h_i.而小A除了生命值之外,还有一个属性是魔法值m. 小A和怪物们依次行 ...

  6. 专业模拟飞行11 linux,simMarket: HIFI TECH - ACTIVE SKY XP 模拟飞行天气软件 X-PLANE 11

    本产品目前不支持 Mac, Linux 操作系统 以及32位 X-Plane/Windows 版本 Introducing HiFi's first weather engine for the X- ...

  7. mips汇编计算开方_全国计算机一级考试模拟题(11)

    点击蓝色公众号名称快来关注我吧! uqkur课堂 一级第11套 1.计算机字长是(). A.处理器处理数据的宽度 B.存储一个字符的位数 C.屏幕一行显示字符的个数 D.存储一个汉字的位数 2.以下程 ...

  8. DX9中如何模拟DX10/11里的ConstantBuffer

    今天,我的引擎的DX9 RenderApi插件终于可以跑起来了.虽然问题还很多.不过总算看到图像了.立碑纪念一下. 一开始基于DX10的API来构造整个渲染系统的.DX10的API带来很多新的概念设计 ...

  9. 全国计算机考模拟试题,全国计算机等级考试一级模拟试题11

    在存储一个汉字内码的两个字节中,每个字节的最高位是( ).A A.1和1 B.1和0 C.0和1 D.0和0 2.十进制数0.6531转换为二进制数为( ).C A.0.100101 B.0.1000 ...

最新文章

  1. 各种开发源代码软件许可证异同
  2. ad域推送软件_Python3.6.4 软件安装教程
  3. SSH(Struts2+Hibernate+Spring)开发策略
  4. HarmonyOS之常用布局PositionLayout的使用
  5. const 常量_var,let,const 的区别?
  6. 高计算密度+低功耗!浪潮新一代高密度服务器SA5248M4横空出世
  7. 进制转换工具类-JAVA
  8. java 启动xms_关于java:启动JVM时-Xms和-Xmx参数是什么?
  9. 如何提高matlab的运算速度慢,如何提高MATLAB的运算速度
  10. Hbase与zookeeper
  11. java删除文件夹及下面的所有文件
  12. Android源码 目录
  13. 复印机扫描仪错误怎么回事_打印机扫描后出现错误怎么处理?
  14. 如何设立清晰的可衡量的目标(SMART原则)
  15. QQ认证空间已升级QQ公众空间,申请地址是?
  16. Windows update 注册表项
  17. signature=ae0de8e34b6245c325b1b433d9eb5401,ELMA 德国艾尔玛,机械式增量型编码器, E27-0-21151 AL011...
  18. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
  19. java 对Outlook保存的.Msg格式文件解析
  20. DDN周报|3月26日-4月1日

热门文章

  1. columns列:Rows 工作表上所有的行
  2. sql 按照天环比_SQL 求同比 环比
  3. ireport使用参考
  4. 关闭java程序脚本-linux
  5. fastjson中@JSONType的使用-排除字段
  6. Apollo使用ConfigBean装载配置
  7. 基于JQuery做的一个简单的点击显示和隐藏的小Demo
  8. KPN iTV的敏捷转型之旅
  9. 【T-SQL基础】02.联接查询
  10. LintCode-- Remove Linked List Elements