Description

给两个多边形,问否在平移旋转不翻转不重叠的情况下拼成一个凸多边形。

Input

每组第一行一个数N表示第一个多边形的顶点数,下接N行按顺序(逆/顺时针)给出顶点坐标,再下一行给一个数M表示第二个多边形的顶点数,下接M行按顺序给出顶点坐标。

Output

对于每组数据,输出一行0/1,1表示能,0表示不能。

Sample Input

  1. 4
    0 0
  2. 0 1
  3. 1 1
  4. 1 0
  5. 4
  6. 0 0
  7. 0 1
  8. 1 1
  9. 1 0
  10. 4
  11. 0 0
  12. 0 1
  13. 1 1
  14. 1 0
  15. 4
  16. 0 0
  17. 0 1
  18. 1 1
  19. 1 0

Sample Output

  1. 1
  2. 1

HINT

对于100%的数据,N<=1000,M<=1000,顶点坐标为实数,标程精度1e-8

题解:

平面计算几何题。每次枚举相拼的两条边,在按顺序扫过两个多边形对应的变,检查是否是无缝屏接,拼好后是否是凸多边形。

注意给点的顺序不一定都是逆时针的,先按照给点的顺序扫过每一条边,记录下角度的偏转情况。若最终偏转为-2π,则为顺时针;若为2π,则为逆时针。

通过倒着排序给出的点,使两个多边形都变成是逆时针的,就可以正常做了。

代码:

  1. var
  2. i,j,k,l,n,m:longint;
  3. a,b:array[-..,..]of extended;
  4. tt:array[..]of extended;
  5. e:extended;
  6. function dis(x,y,xx,yy:extended):extended;
  7. begin
  8. exit(sqrt(sqr(x-xx)+sqr(y-yy)));
  9. end;
  10. function xj2(x,y:extended):extended;
  11. var i,j,k,l:longint;
  12. begin
  13. if(abs(x)<0.0000001)and(y>)then exit(pi/);
  14. if(abs(x)<0.0000001)and(y<)then exit(*pi/);
  15. if(abs(y)<0.0000001)and(x>)then exit();
  16. if(abs(y)<0.0000001)and(x<)then exit(pi);
  17. if(x>)and(y>)then exit(arctan(y/x));
  18. if(x>)and(y<)then exit(*pi-arctan(-y/x));
  19. if(x<)and(y>)then exit(pi/+arctan(-x/y));
  20. if(x<)and(y<)then exit(pi+arctan(y/x));
  21. end;
  22. function xj(x,y,xx,yy,xxx,yyy:extended):extended;
  23. var z1,z2:extended;
  24. begin
  25. z1:=xj2(x-xx,y-yy);
  26. z2:=xj2(xxx-xx,yyy-yy);
  27. while z2>0.0000001+z1 do z2:=z2-*pi;
  28. exit(z1-z2);
  29. end;
  30. function ss:longint;
  31. var i,j,ii,jj,k,l:longint;
  32. z1,z2,z3:extended;
  33. begin
  34. for i:= to n do
  35. for j:= to m do
  36. if abs(dis(a[i-,],a[i-,],a[i,],a[i,])
  37. -dis(b[j+,],b[j+,],b[j,],b[j,]))<0.0000001 then
  38. begin
  39. z1:=xj(a[i-,],a[i-,],a[i-,],a[i-,],a[i,],a[i,]);
  40. z2:=xj(b[j+,],b[j+,],b[j+,],b[j+,],b[j,],b[j,]);
  41. while z2>0.0000001+z1 do z2:=z2-*pi;
  42. if z1-z2>pi+0.0000001 then continue;
  43. ii:=i+; jj:=j-; l:=;
  44. while true do
  45. begin
  46. z1:=xj(a[ii-,],a[ii-,],a[ii-,],a[ii-,],a[ii,],a[ii,]);
  47. z2:=xj(b[jj+,],b[jj+,],b[jj+,],b[jj+,],b[jj,],b[jj,]);
  48. while z2>0.0000001+z1 do z2:=z2-*pi;
  49. if z1-z2<0.0000001 then
  50. begin
  51. if abs(dis(a[ii-,],a[ii-,],a[ii,],a[ii,])
  52. -dis(b[jj+,],b[jj+,],b[jj,],b[jj,]))<0.0000001 then
  53. begin inc(ii); dec(jj); end else begin l:=; break; end;
  54. continue;
  55. end;
  56. if z1-z2<pi-0.0000001 then
  57. begin l:=; break; end;
  58. break;
  59. end;
  60. if l= then
  61. begin
  62. for k:=ii to i+n- do
  63. if xj(a[k-,],a[k-,],a[k,],a[k,],a[k+,],a[k+,])>pi+0.0000001
  64. then begin l:=; break; end;
  65. for k:=jj downto j-m+ do
  66. if xj(b[k+,],b[k+,],b[k,],b[k,],b[k-,],b[k-,])<pi-0.0000001
  67. then begin l:=; break; end;
  68. if l= then exit();
  69. end;
  70. end;
  71. exit();
  72. end;
  73. begin
  74. while not eof do
  75. begin
  76. readln(n);
  77. for i:= to n do readln(a[i,],a[i,]);
  78. a[n+]:=a[]; a[]:=a[n]; e:=;
  79. for i:= to n do
  80. e:=e+xj(a[i-,],a[i-,],a[i,],a[i,],a[i+,],a[i+,])-pi;
  81. if e> then
  82. begin
  83. for i:= to n div do begin tt:=a[i]; a[i]:=a[n-i+]; a[n-i+]:=tt; end;
  84. end;
  85. for i:= to n do a[i-n]:=a[i];
  86. for i:= to n do a[i+n]:=a[i];
  87. readln(m);
  88. for i:= to m do readln(b[i,],b[i,]);
  89. b[m+]:=b[]; b[]:=b[m]; e:=;
  90. for i:= to m do
  91. e:=e+xj(b[i-,],b[i-,],b[i,],b[i,],b[i+,],b[i+,])-pi;
  92. if e> then
  93. begin
  94. for i:= to m div do begin tt:=b[i]; b[i]:=b[m-i+]; b[m-i+]:=tt; end;
  95. end;
  96. for i:= to m do b[i-m]:=b[i];
  97. for i:= to m do b[i+m]:=b[i];
  98. writeln(ss);
  99. end;
  100. end.

BZOJ2191:Splite的更多相关文章

  1. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  2. splite与join

    Python split() 通过指定分隔符对字符串进行切片 切片之后为list数据类型. sentence = 'I can because I think I can ' s_1 = senten ...

  3. csv to splite db form

    termsql: https://github.com/tobimensch/termsql termsql -i textfile -d ',' -o sqlite.db 添加列名 termsql ...

  4. css雪碧图(css splite)

    将很多小的背景图片放在一起,可以减少http请求. 这些图片通常是一类的. 所以使用雪碧图. 雪碧图即为: 测试一下减少了多长时间 0 = 0

  5. Java中splite的用法与小技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...

  6. mysql使用substring_index达到splite功能

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  7. 【Linux】Linux 环境下splite以及一些正则使用

    由于在windows下,遍历目录,想查找满足条件的文件: dir /s > ..\fileresult.txt 结果得到的文件过大,999多MB的txt: split -b 10k date.f ...

  8. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  9. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

随机推荐

  1. JQUERY 效果 遍历 事件

    效果 隐藏与显示  hide() 和 show() 淡入淡出  fadeIn(speed,callback).fadeOut(speed,callback). fadeToggle() 方法可以在 f ...

  2. QT安装以及使用(QT支持linux和windows,也支持C/C++代码的编译运行,比vs简洁多)

    Windows: 0. QT Versionqt-win-opensource-4.7.4-mingwqt-creator-win-opensource-2.4.1 1. 系统Windows 7 &a ...

  3. JS预解析与变量提升

    预解析 JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的.JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程 预解析过程 ...

  4. Perl 变量

    Perl 变量 变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间. 解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等. 上一 ...

  5. Helvetic Coding Contest 2018 online mirror (teams allowed, unrated)F3 - Lightsabers (hard)

    题意:n个数字1-m,问取k个组成的set方案数 题解:假设某个数出现k次,那么生成函数为\(1+x+...+x^k\),那么假设第i个数出现ai次,结果就是\(\sum_{i=1}^m(1+x+.. ...

  6. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  7. idea激活破解

    下载链接:https://pan.baidu.com/s/1BADk1MCm0YxtB6zoX0DivA 提取码 ze9m将破解补丁放到bin文件中jetbrains-all.jar 在这俩个文件最后 ...

  8. 主页面与iframe页面之间的javascript函数的调用

    1:在主页面里调用iframe页里面的javascript函数 <script type="text/javascript"> var childWindow = $( ...

  9. 封装一个C#日志类Loger

    public class Loger { /// <summary> /// 写入日志 /// </summary> /// <param name="cont ...

  10. 基于Swagger+SpringBoot快速构建javaweb项目

    章节导航 SpringBoot&Swagger简介 数据模型和接口定义 项目框架生成 业务逻辑实现 项目源码地址 github项目路径:https://github.com/Vikezhu/s ...