Description

桌上有一张边界平行于坐标轴的正方形纸片,左下角的坐标为(0,0),右上角的坐标为(100,100)。接下来执行n条折纸命令。每条命令用两个不同点P1(x1,y1)和P2(x2,y2)来表示,执行时把当前的折纸作品沿着P1P2所在直线折叠,并把有向线段P1P2的右边折向左边(左边的部分保持不变)。折叠结束后,需要在作品上打一个孔,然后用绳子穿起来挂在墙上。孔的位置是相当重要的:若需要穿过太多层的纸,打孔本身比较困难;若穿过的层数太少,悬挂起来以后作品可能会被撕破。为了选择一个比较合适的打孔位置,你需要计算在每个候选位置打孔时穿过的层数。如果恰好穿过某一层的边界(误差0.000001内),则该层不统计在结果中。本题考虑一个简化的模型:纸的厚度不计,因此折纸操作总能完美执行。
Input

输入第一行为一个整数n,即折纸的次数。以下n行每行四个实数x1,y1,x2,y2,表示每次折纸时对应的有向线段。下一行包含一个正整数m,即候选位置的个数,以下每行包含两个实数x,y,表示一个候选位置。
Output

每个候选位置输出一行,包含一个整数,即该位置打孔时穿过的层数。
Sample Input
2
-0.5 -0.5 1 1
1 75 0 75
6
10 60
80 60
30 40
10 10
50 50
20 50

Sample Output
4
2
2
0
0
2

HINT

样例说明 【限制】 20%的数据满足:n<=1 100%的数据满足:0<=n<=8, 1<=m<=50

话说我也不知道我怎么就想到了这个想法

对于每个询问,我们可以暴力求出它穿过的点原来是在什么位置,因为n<=8,所以最多有2^8个点,然后排序判重(话说我排序只是为了好判重)

再对每一个点做一遍那n个操作,看是不是落在现在这个点,是的话ans+1

然后就做完了

求对称点的话,我是用向量求的,用向量可以很容易计算出距离,然后求直线的法向量,就是直接旋转90度,再用那个点加上法向量的多少倍(用距离算一下)就是对称点了

思路倒是清晰,只是判重的时候傻×了一下,我本来是想排序后相同的就把前面的改掉,写着写着就变成把后边的改掉,答案就大了好多

  1. const
  2. eps=1e-6;
  3. type
  4. segment=record
  5. x1,y1,x2,y2:double;
  6. end;
  7. point=record
  8. x,y:double;
  9. end;
  10. var
  11. n,m:longint;
  12. a:array[..]of segment;
  13. b:array[..]of point;
  14.  
  15. function cj(x1,y1,x2,y2:double):double;
  16. begin
  17. exit(x1*y2-y1*x2);
  18. end;
  19.  
  20. procedure init;
  21. var
  22. i:longint;
  23. begin
  24. read(n);
  25. for i:= to n do
  26. with a[i] do
  27. read(x1,y1,x2,y2);
  28. end;
  29.  
  30. procedure swap(var x,y:point);
  31. var
  32. t:point;
  33. begin
  34. t:=x;x:=y;y:=t;
  35. end;
  36.  
  37. procedure sort(l,r:longint);
  38. var
  39. i,j:longint;
  40. y:point;
  41. begin
  42. i:=l;
  43. j:=r;
  44. y:=b[(l+r)>>];
  45. repeat
  46. while (b[i].x<y.x) or ((b[i].x=y.x)and(b[i].y<y.y)) do
  47. inc(i);
  48. while (b[j].x>y.x) or ((b[j].x=y.x)and(b[j].y>y.y)) do
  49. dec(j);
  50. if i<=j then
  51. begin
  52. swap(b[i],b[j]);
  53. inc(i);
  54. dec(j);
  55. end;
  56. until i>j;
  57. if i<r then sort(i,r);
  58. if j>l then sort(l,j);
  59. end;
  60.  
  61. procedure get(b:point;c:segment;var a:point);
  62. var
  63. d:double;
  64. begin
  65. a.x:=c.y1-c.y2;
  66. a.y:=c.x2-c.x1;
  67. d:=cj(c.x2-c.x1,c.y2-c.y1,b.x-c.x1,b.y-c.y1)/sqrt(sqr(c.x1-c.x2)+sqr(c.y1-c.y2));
  68. a.x:=a.x/sqrt(sqr(c.x1-c.x2)+sqr(c.y1-c.y2));
  69. a.y:=a.y/sqrt(sqr(c.x1-c.x2)+sqr(c.y1-c.y2));
  70. a.x:=b.x-a.x*d*;
  71. a.y:=b.y-a.y*d*;
  72. end;
  73.  
  74. procedure work;
  75. var
  76. i,j,k,num,ans:longint;
  77. begin
  78. read(m);
  79. for i:= to m do
  80. begin
  81. ans:=;
  82. with b[] do
  83. read(x,y);
  84. b[]:=b[];
  85. num:=;
  86. for j:=n downto do
  87. begin
  88. for k:= to num do
  89. get(b[k],a[j],b[k+num]);
  90. num:=num<<;
  91. end;
  92. sort(,num);
  93. for j:= to num do
  94. if (abs(b[j].x-b[j-].x)<eps) and (abs(b[j-].y-b[j].y)<eps) then b[j-].x:=;
  95. for j:= to num do
  96. if not((b[j].x>eps) and (b[j].x+eps<) and (b[j].y>eps) and (b[j].y+eps<)) then b[j].x:=
  97. else
  98. for k:= to n do
  99. if abs(cj(a[k].x2-a[k].x1,a[k].y2-a[k].y1,b[j].x-a[k].x1,b[j].y-a[k].y1))<eps then b[j].x:=
  100. else
  101. if cj(a[k].x2-a[k].x1,a[k].y2-a[k].y1,b[j].x-a[k].x1,b[j].y-a[k].y1)< then get(b[j],a[k],b[j]);
  102. for j:= to num do
  103. if (abs(b[j].x-b[].x)<eps) and (abs(b[j].y-b[].y)<eps) then inc(ans);
  104. writeln(ans);
  105. end;
  106. end;
  107.  
  108. begin
  109. init;
  110. work;
  111. end.

1074: [SCOI2007]折纸origami - BZOJ的更多相关文章

  1. 【BZOJ】1074: [SCOI2007]折纸origami

    http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...

  2. 1074: [SCOI2007]折纸origami

    Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 372  Solved: 229[Submit][Status][Discuss] Descriptio ...

  3. BZOJ1074 [SCOI2007]折纸origami

    我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. /** ...

  4. 【题解】折纸 origami [SCOI2007] [P4468] [Bzoj1074]

    [题解]折纸 origami [SCOI2007] [P4468] [Bzoj1074] 传送门:折纸 \(\text{origami [SCOI2007] [P4468]}\) \(\text{[B ...

  5. CSS3写折纸

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. 折纸问题java实现

    /** * 折纸问题 这段代码写的太low了 本人水平有限 哎... 全是字符串了 * @param n * @return * @date 2016-10-7 * @author shaobn */ ...

  7. CSS3实现文字折纸效果

    CSS3实现文字折纸效果 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title></tit ...

  8. UVA 177 PaperFolding 折纸痕 (分形,递归)

    著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条.现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每 ...

  9. ZR#955 折纸

    ZR#955 折纸 解法: 可以发现折纸之后被折到上面的部分实际上是没有用的,因为他和下面对应位置一定是一样的,而影响答案的只有每个位置的颜色和最底层的坐标范围.因此,我们只需要考虑最底层即可,即我们 ...

随机推荐

  1. IE9+浏览器input文本框/密码框后面的小叉子/小眼睛清除

    为了方便我们的触控操作,IE高等浏览器针对input及input type="password"分别提供了快速清除钮(X图标)以及密码文字显示钮(小眼睛图标)的功能. 由于这经常跟 ...

  2. win10下怎么在桌面创建IIS快捷方式

    在电脑上打开C:\Windows\System32\inetsrv,在里面找到InetMgr.exe,如图 2 右击InetMgr.exe会发现没有发送到桌面的选项,所以我们选择创建快捷方式,如图 3 ...

  3. 【Android学习】调用系统短信、电话

    今天全心投入Android学习已经有一段时间了,从起初的啥也不懂,到现在半知半解状态,随笔记录些简单且常用的系统功能代码. 调用Android系统短信,其实调用短信非常简单,一个方法就可以搞定.我们可 ...

  4. DOS批处理命令-几个固定名称的变量

    批处理中有一些变量的变量名称是固定的,具有特定的意义,接下来,我们来看看这些有特定意义的变量到底有什么意义. 1.%CD%   当前路径的路径名[盘符 + 路径]    - 現在のディレクトリ文字列に ...

  5. Android手机一键Root原理分析

    图/文 非虫 一直以来,刷机与Root是Android手机爱好者最热衷的事情.即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲.就在前天晚上,一年一度的Google I/O大会拉开了帷 ...

  6. iPhone左下角app图标

    iOS8之后,苹果增加了一个新功能.会根据位置,自动在锁屏界面左下角出现相关应用.比如用户在苹果零售店时候,右下角会出现Apple Store官方应用的快捷方式,按住左下角的图标向上滑动,即可快速解锁 ...

  7. lucene4入门(1)

    欢迎转载http://www.cnblogs.com/shizhongtao/p/3440325.html lucene你可以理解为一种数据库,他是全文搜索的一种引擎. 1.首先去官网download ...

  8. linux同步

    1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...

  9. [java学习笔记]java语言基础概述之运算符&程序流程控制&for循环嵌套

    一.运算符 算数运算符 +,-,*,/,%,++,-- 1.+,-,*,/ 整数除以整数的结果为舍弃了小数部分的整数. 2.%:取余 %左右都为正数,左边小于右边结果为左边值,如,4%5=4 %左边大 ...

  10. 初试集群虚拟化搭建(二)—— Xen, kvm, OpenStack, VMware ESXi, Citrix XenServer等种种选择

    小伙伴们找到了一些主流方案的资料,最终选择了XenServer6.5作为平台搭建. Xen 特点: 功能强大,支持Linux的各种发行版本 通常是在现有Linux操作系统上安装,是一种半虚拟化的安装方 ...