Description

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

Input

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

Output

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

Sample Input

4
0 0
0 1
1 1
1 0
4
0 0
0 1
1 1
1 0
4
0 0
0 1
1 1
1 0
4
0 0
0 1
1 1
1 0

Sample Output

1
1

HINT

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

题解:

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

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

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

代码:

 var
i,j,k,l,n,m:longint;
a,b:array[-..,..]of extended;
tt:array[..]of extended;
e:extended;
function dis(x,y,xx,yy:extended):extended;
begin
exit(sqrt(sqr(x-xx)+sqr(y-yy)));
end;
function xj2(x,y:extended):extended;
var i,j,k,l:longint;
begin
if(abs(x)<0.0000001)and(y>)then exit(pi/);
if(abs(x)<0.0000001)and(y<)then exit(*pi/);
if(abs(y)<0.0000001)and(x>)then exit();
if(abs(y)<0.0000001)and(x<)then exit(pi);
if(x>)and(y>)then exit(arctan(y/x));
if(x>)and(y<)then exit(*pi-arctan(-y/x));
if(x<)and(y>)then exit(pi/+arctan(-x/y));
if(x<)and(y<)then exit(pi+arctan(y/x));
end;
function xj(x,y,xx,yy,xxx,yyy:extended):extended;
var z1,z2:extended;
begin
z1:=xj2(x-xx,y-yy);
z2:=xj2(xxx-xx,yyy-yy);
while z2>0.0000001+z1 do z2:=z2-*pi;
exit(z1-z2);
end;
function ss:longint;
var i,j,ii,jj,k,l:longint;
z1,z2,z3:extended;
begin
for i:= to n do
for j:= to m do
if abs(dis(a[i-,],a[i-,],a[i,],a[i,])
-dis(b[j+,],b[j+,],b[j,],b[j,]))<0.0000001 then
begin
z1:=xj(a[i-,],a[i-,],a[i-,],a[i-,],a[i,],a[i,]);
z2:=xj(b[j+,],b[j+,],b[j+,],b[j+,],b[j,],b[j,]);
while z2>0.0000001+z1 do z2:=z2-*pi;
if z1-z2>pi+0.0000001 then continue;
ii:=i+; jj:=j-; l:=;
while true do
begin
z1:=xj(a[ii-,],a[ii-,],a[ii-,],a[ii-,],a[ii,],a[ii,]);
z2:=xj(b[jj+,],b[jj+,],b[jj+,],b[jj+,],b[jj,],b[jj,]);
while z2>0.0000001+z1 do z2:=z2-*pi;
if z1-z2<0.0000001 then
begin
if abs(dis(a[ii-,],a[ii-,],a[ii,],a[ii,])
-dis(b[jj+,],b[jj+,],b[jj,],b[jj,]))<0.0000001 then
begin inc(ii); dec(jj); end else begin l:=; break; end;
continue;
end;
if z1-z2<pi-0.0000001 then
begin l:=; break; end;
break;
end;
if l= then
begin
for k:=ii to i+n- do
if xj(a[k-,],a[k-,],a[k,],a[k,],a[k+,],a[k+,])>pi+0.0000001
then begin l:=; break; end;
for k:=jj downto j-m+ do
if xj(b[k+,],b[k+,],b[k,],b[k,],b[k-,],b[k-,])<pi-0.0000001
then begin l:=; break; end;
if l= then exit();
end;
end;
exit();
end;
begin
while not eof do
begin
readln(n);
for i:= to n do readln(a[i,],a[i,]);
a[n+]:=a[]; a[]:=a[n]; e:=;
for i:= to n do
e:=e+xj(a[i-,],a[i-,],a[i,],a[i,],a[i+,],a[i+,])-pi;
if e> then
begin
for i:= to n div do begin tt:=a[i]; a[i]:=a[n-i+]; a[n-i+]:=tt; end;
end;
for i:= to n do a[i-n]:=a[i];
for i:= to n do a[i+n]:=a[i];
readln(m);
for i:= to m do readln(b[i,],b[i,]);
b[m+]:=b[]; b[]:=b[m]; e:=;
for i:= to m do
e:=e+xj(b[i-,],b[i-,],b[i,],b[i,],b[i+,],b[i+,])-pi;
if e> then
begin
for i:= to m div do begin tt:=b[i]; b[i]:=b[m-i+]; b[m-i+]:=tt; end;
end;
for i:= to m do b[i-m]:=b[i];
for i:= to m do b[i+m]:=b[i];
writeln(ss);
end;
end.

BZOJ2191Splite的更多相关文章

随机推荐

  1. BLE 广播数据解析

    从上一篇GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BLE ...

  2. CVPR 2013 录用论文【待更新】

    完整录用论文官方链接:http://www.pamitc.org/cvpr13/program.php 过段时间CvPaper上面应该会有正文链接 今年有关RGB-D摄像机应用和研究的论文渐多起来了. ...

  3. find which process occupy the PORT

    mac :   lsof -i:8080 linux : netstat -anltp | grep 8080

  4. C# winCE连接SQL数据库

    General network error.  Check your network documentation. 错误解决方法 1. public static string Sqlstr = &q ...

  5. ThinkPHP函数详解:N方法

    N方法属于计数器方法,被用于核心的查询.缓存统计的计数和统计.但是其实可以用于应用的其他计数用途,用法比较简单,调用格式:N('计数位置'[,'步进值'])例如,我们要统计页面中的查询次数,可以用 N ...

  6. hazelcast的坑爹事

    转载自 http://blog.csdn.net/hengyunabc/article/details/18514563 简介 开源中国的简介: Hazelcast是一个高度可扩展的数据分发和集群平台 ...

  7. (转) ASP.NET反射

    原文:http://www.cnblogs.com/zizo/p/3509895.html 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何 ...

  8. C++Primer笔记二

    真是一本好书,就这么点,就感觉学到很多了,当然也是我水平太差. 用shell或者bash的时候有一个文件重定向,就是每次程序运行的时候,我们都需要手动输入内容,然后程序输出内容,这时可以用文件来代替. ...

  9. MVC小系列(二)【Razor 模板引擎】

    Razor 模板引擎 Razor模板页:它使我们不用再使用master模板了 一 :@Url.Content:是可以加载CSS和JS等文件比如: <link href="@Url.Co ...

  10. linux下源码安装软件

    在linux下的很多软件都是通过源码包方式发布的,这样做对于最终用户而言,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包 ...