1074: [SCOI2007]折纸origami - BZOJ
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的更多相关文章
- 【BZOJ】1074: [SCOI2007]折纸origami
http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...
- 1074: [SCOI2007]折纸origami
Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 372 Solved: 229[Submit][Status][Discuss] Descriptio ...
- BZOJ1074 [SCOI2007]折纸origami
我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. /** ...
- 【题解】折纸 origami [SCOI2007] [P4468] [Bzoj1074]
[题解]折纸 origami [SCOI2007] [P4468] [Bzoj1074] 传送门:折纸 \(\text{origami [SCOI2007] [P4468]}\) \(\text{[B ...
- CSS3写折纸
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 折纸问题java实现
/** * 折纸问题 这段代码写的太low了 本人水平有限 哎... 全是字符串了 * @param n * @return * @date 2016-10-7 * @author shaobn */ ...
- CSS3实现文字折纸效果
CSS3实现文字折纸效果 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title></tit ...
- UVA 177 PaperFolding 折纸痕 (分形,递归)
著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条.现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每 ...
- ZR#955 折纸
ZR#955 折纸 解法: 可以发现折纸之后被折到上面的部分实际上是没有用的,因为他和下面对应位置一定是一样的,而影响答案的只有每个位置的颜色和最底层的坐标范围.因此,我们只需要考虑最底层即可,即我们 ...
随机推荐
- Spring(3.2.3) - Beans(10): 生命周期
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...
- MyBatis(3.2.3) - Configuring MyBatis using XML, Environment
The key component of MyBatis is SqlSessionFactory from which we get SqlSession and execute the mappe ...
- HDOJ2022海选女主角
海选女主角 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- JavaScript之图片轮换
<!doctype html> <title>javascript图片轮换</title> <meta charset="utf-8"/& ...
- Linux文件系统结构
准备写个Linux基础知识总结, 第一个想到的就是整理一个常用系统文件夹结构的说明,园子里“Aric小屋”的结构图整理的不错,我就不重复整理了,故借用一下
- Touch ID指纹解锁使用
Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另 ...
- KSImageNamed-Xcode插件在xcode 6.4/6.3或其他版本中不能使用解决方案
大家都知道这个插件很强大,但是现在这个插件最新版貌似只支持xcode7 ,需要修改KSImageNamed-xcode中的一个配置文件,添加uuid才能使他支持xcode6.3或6.4 进入下载的插件 ...
- 详解在Visual Studio中使用git版本系统
转自:http://www.uml.org.cn/pzgl/201206211.asp
- (转)深入探讨在集群环境中使用 EhCache 缓存系统
简介: EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.本文充分的介绍了 EhCache 缓存系统对集群环境的 ...
- 暑假集训(4)第三弹 -----递推(Hdu1799)
问题描述:还记得正在努力脱团的小A吗? 他曾经最亲密的战友,趁他绘制贤者法阵期间,暗中设下鬼打墙将小A 围困,并准备破坏小A正在绘制的法阵.小A非常着急.想阻止他的行动.而要阻止他,必须先破解鬼打墙. ...