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[0..8]of segment;
 13     b:array[0..300]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:=1 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)>>1];
 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*2;
 71     a.y:=b.y-a.y*d*2;
 72 end;
 73
 74 procedure work;
 75 var
 76     i,j,k,num,ans:longint;
 77 begin
 78     read(m);
 79     for i:=1 to m do
 80       begin
 81         ans:=0;
 82         with b[1] do
 83           read(x,y);
 84         b[0]:=b[1];
 85         num:=1;
 86         for j:=n downto 1 do
 87           begin
 88             for k:=1 to num do
 89               get(b[k],a[j],b[k+num]);
 90             num:=num<<1;
 91           end;
 92         sort(1,num);
 93         for j:=2 to num do
 94           if (abs(b[j].x-b[j-1].x)<eps) and (abs(b[j-1].y-b[j].y)<eps) then b[j-1].x:=100000;
 95         for j:=1 to num do
 96           if not((b[j].x>eps) and (b[j].x+eps<100) and (b[j].y>eps) and (b[j].y+eps<100)) then b[j].x:=1000
 97           else
 98           for k:=1 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:=1000000
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)<0 then get(b[j],a[k],b[j]);
102         for j:=1 to num do
103           if (abs(b[j].x-b[0].x)<eps) and (abs(b[j].y-b[0].y)<eps) then inc(ans);
104         writeln(ans);
105       end;
106 end;
107
108 begin
109     init;
110     work;
111 end.

View Code

转载于:https://www.cnblogs.com/Randolph87/p/3629347.html

1074: [SCOI2007]折纸origami - BZOJ相关推荐

  1. Origami Airplanes Folds In 3D:非常给力的3D折纸应用

    折纸起源于中国,在日本发展成为一种艺术.由于折纸能锻炼人的手.眼和大脑综合协调能力,所以很受欢迎,尤其对妹纸们来说,给心爱的他折点千纸鹤神马的更是觉得意义非凡.而对男童鞋来说,折纸飞机也是儿时乐趣之一 ...

  2. 凝血酶分子机器人_DNA折纸(DNA Origami)技术搭载凝血酶分子阻断肿瘤供血

    原标题:DNA折纸(DNA Origami)技术搭载凝血酶分子阻断肿瘤供血 智能抗癌DNA纳米机器人阻断肿瘤血管 曾经的科幻剧,转眼间就化为了现实.近期的<自然·生物技术>上,中科院国家纳 ...

  3. 哈佛研究人员开发基于折纸造型高精度微型手术机器人

    近年来,机器人已经在外科手术中扮演了越来越重要的角色.在拓展医生能力的同时,还可带来更高的手术精度和控制水平. 本文要为大家介绍的,就是由哈佛大学怀斯研究所副教授 Robert Wood 博士开发的一 ...

  4. php视频教程折蜗牛,折纸蜗牛的手工折法视频教程

    折纸蜗牛的手工折法视频教程 折纸蜗牛的制作教程之前以简单的形式在儿童折纸的手工制作栏目中和大家分享过,简单的儿童折纸蜗牛制作起来往往比较的简单一些,基本上没有太多的特点,但是实际上还有一些比较复杂的手 ...

  5. 他们用折纸解决了两个数学难题,还折出了天文望远镜!!

    科学无国界,我们是知识的搬运工. 折纸是一门古老而有趣的艺术,然而当今的科学家们开始从新的角度审视这项艺术形式,将它应用于生活和科学的众多方面--没准,在你身边就有融合了折纸艺术的美妙产物. 当我九岁 ...

  6. 折纸折痕设计软件_折纸简介中的自适应设计

    折纸折痕设计软件 Lately Origami has been my go-to design tool for prototyping complex touch interactions. I' ...

  7. axure原型设计入门_应用程序原型:Facebook折纸入门

    axure原型设计入门 In the world of software development a prototype is a working, rudimentary version of an ...

  8. 折纸 css_折纸:CSS 3D折叠图像库

    折纸 css Space on web pages is growing tighter as mobile development gains in popularity. In response, ...

  9. php视频教程折蜗牛,简单立体折纸蜗牛的折纸视频教程

    简单立体折纸蜗牛的折纸视频教程 简单折纸的创意手工制作方法教程能够教会我们一些有趣而且有创意感的手工折纸设计和制作哦.这里纸艺网推荐的这个手工折纸制作教程教大家完成制作的是一个可爱的折纸蜗牛的制作教程 ...

最新文章

  1. 启示录:打造用户喜爱的产品【PDF清晰版】,产品经理必看书籍之一
  2. 点到点链路的滑动窗口协议
  3. Oracle存储结构_文件
  4. 如何将yolo的标注(annotations).txt 坐标转换成tensorflow-yolov3(YunYang1994)的.txt 标注坐标?
  5. Linux安装指定版本Angular Cli
  6. Nginx SSI 设置
  7. [转]关于数据库的并发性的一个解决方案
  8. Skype for Business 2015全新部署_10.边缘服务器安装01
  9. nginx 1.8.0下载
  10. oracle undo head,一次悬挂事务的处理思路
  11. can't resolve symbol 'R' ...
  12. 钓鱼网站 (搬运自common craft )
  13. 汉字字符编码在线查询的网站
  14. fw313r手机登录_2017最新迅捷(FAST)fw313r路由器手机设置教程
  15. Linux常用网络指令
  16. 程序员的工作总结(2017-12-04)
  17. linux系统github全局加速
  18. 联想g400从u盘启动计算机,【联想G40怎么从U盘启动】联想g40怎么设置u启动_联想g40从u盘启动...
  19. asp.net+js+ajax实现手机移动端页面预览、剪裁、上传头像图片
  20. Ubuntu设置屏幕分辨率

热门文章

  1. 客户端程序调用zookeeper报len4807928异常
  2. Citrix小贴纸---连接XenAPP时协议驱动程序错误
  3. Java 8 Optional类深度解析(转)
  4. 统计代码行数的方法梳理
  5. 勒索软件再次降临 教育网为什么成为重灾区
  6. 《CCNA安全640-554认证考试指南》——第6章在Cisco IOS设备上保护管理层
  7. 05SpringMvc_映射器SimpleUrlHanderMapping
  8. 【转】处事22计、心态24条、伤心50句、礼仪73、学会长大20!
  9. 【转】动态模型及其求解介绍–番外篇
  10. simhash与Google的网页去重(转)