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度,再用那个点加上法向量的多少倍(用距离算一下)就是对称点了

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

 const
eps=1e-6;
type
segment=record
x1,y1,x2,y2:double;
end;
point=record
x,y:double;
end;
var
n,m:longint;
a:array[..]of segment;
b:array[..]of point; function cj(x1,y1,x2,y2:double):double;
begin
exit(x1*y2-y1*x2);
end; procedure init;
var
i:longint;
begin
read(n);
for i:= to n do
with a[i] do
read(x1,y1,x2,y2);
end; procedure swap(var x,y:point);
var
t:point;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j:longint;
y:point;
begin
i:=l;
j:=r;
y:=b[(l+r)>>];
repeat
while (b[i].x<y.x) or ((b[i].x=y.x)and(b[i].y<y.y)) do
inc(i);
while (b[j].x>y.x) or ((b[j].x=y.x)and(b[j].y>y.y)) do
dec(j);
if i<=j then
begin
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure get(b:point;c:segment;var a:point);
var
d:double;
begin
a.x:=c.y1-c.y2;
a.y:=c.x2-c.x1;
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));
a.x:=a.x/sqrt(sqr(c.x1-c.x2)+sqr(c.y1-c.y2));
a.y:=a.y/sqrt(sqr(c.x1-c.x2)+sqr(c.y1-c.y2));
a.x:=b.x-a.x*d*;
a.y:=b.y-a.y*d*;
end; procedure work;
var
i,j,k,num,ans:longint;
begin
read(m);
for i:= to m do
begin
ans:=;
with b[] do
read(x,y);
b[]:=b[];
num:=;
for j:=n downto do
begin
for k:= to num do
get(b[k],a[j],b[k+num]);
num:=num<<;
end;
sort(,num);
for j:= to num do
if (abs(b[j].x-b[j-].x)<eps) and (abs(b[j-].y-b[j].y)<eps) then b[j-].x:=;
for j:= to num do
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:=
else
for k:= to n do
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:=
else
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]);
for j:= to num do
if (abs(b[j].x-b[].x)<eps) and (abs(b[j].y-b[].y)<eps) then inc(ans);
writeln(ans);
end;
end; begin
init;
work;
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. freeCodeCamp:GO BYBY GO!

    千里之行,始于足下. 今天是2016年10月26日, 写前端代码有一年多了, 渐渐找到了一些方向, 知道该往哪里努力, 也慢慢开始总结自己的工作和学习. 希望在这里记录下的点点滴滴, 成为我日后学习的 ...

  2. Java Concurrency - Lock

    Lock 是 Java API 提供的另一种线程同步机制,它提供了比 synchronized 关键字更为灵活.强大的锁定操作. 锁是控制多个线程对共享资源进行访问的工具.通常,所提供了对共享资源的独 ...

  3. Jersey(1.19.1) - Client API, Proxy Configuration

    为 Jersey Client 设置代理,可以使用带有 ClientHandler 参数的构造方法创建 Client 实例. public static void main(String[] args ...

  4. Linux文件系统结构

    准备写个Linux基础知识总结, 第一个想到的就是整理一个常用系统文件夹结构的说明,园子里“Aric小屋”的结构图整理的不错,我就不重复整理了,故借用一下

  5. Cocoa 框架为什么采用两阶段的方式来创建对象?

    对于之前一直使用C#语言的我来说,刚开始接触Objective-c来创建对象时很迷惑,为何创建对象一般情况下需要通过发送两个消息(调用两个方法)才能创建一个类实例对象(例如[[UIButton all ...

  6. 高性能CSS(二)

    避免CSS表达式 CSS表达式是动态设置CSS属性的强大(但危险)方法.Internet Explorer从第5个版本开始支持CSS表达式.下面的例子中,使用CSS表达式可以实现隔一个小时切换一次背景 ...

  7. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...

  8. 2014-10 u-boot 顶层config.mk分析

    /** ****************************************************************************** * @author    Maox ...

  9. Winform DataGridView添加列头checkbox

    using System; using System.Data; using System.Drawing; using System.Windows.Forms; using Yanwen.Logi ...

  10. php中封装的curl函数(抓取数据)

    介绍一个封闭好的函数,封闭了curl函数的常用步骤,方便抓取数据. 代码如下: <?php /** * 封闭好的 curl函数 * 用途:抓取数据 * edit by www.jbxue.com ...