BZOJ2191:Splite
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.
BZOJ2191:Splite的更多相关文章
- Linux大文件分割splite
/********************************************************************** * Linux大文件分割splite * 说明: * 编 ...
- splite与join
Python split() 通过指定分隔符对字符串进行切片 切片之后为list数据类型. sentence = 'I can because I think I can ' s_1 = senten ...
- csv to splite db form
termsql: https://github.com/tobimensch/termsql termsql -i textfile -d ',' -o sqlite.db 添加列名 termsql ...
- css雪碧图(css splite)
将很多小的背景图片放在一起,可以减少http请求. 这些图片通常是一类的. 所以使用雪碧图. 雪碧图即为: 测试一下减少了多长时间 0 = 0
- Java中splite的用法与小技巧
在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...
- mysql使用substring_index达到splite功能
函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...
- 【Linux】Linux 环境下splite以及一些正则使用
由于在windows下,遍历目录,想查找满足条件的文件: dir /s > ..\fileresult.txt 结果得到的文件过大,999多MB的txt: split -b 10k date.f ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 小兔JS教程(四)-- 彻底攻略JS数组
在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...
随机推荐
- 校园商铺-4店铺注册功能模块-8店铺注册之Controller层的改造
不合理的地方: 1. 并不需要将InputStream转换成File类型,直接将InputStream传进入交给CommonsMultipartfile去处理就可以了 如果做这样的转换,每次都需要生成 ...
- 文件的操作repeat
#_author:来童星#date:2019/12/15import os#1# print(os.name)# nt------>windows操作系统#2 用于获取当前操作系统的换行符# p ...
- 用while实现登录操作(3次过后,输入yes,使counter置0,还可以玩)
用while实现登录操作(输入yes,使counter置0,还可以玩)#_author:Administrator#date:2019/10/24user_name="star"p ...
- cocos2D-X LUA 常用功能封装和工作经验的一些解决方案
--[[ Packaging_KernelEngine.h 文件说明:所有对象在建立时位置是优先的,传入位置参数必须cc.p(X,Y) CurObj:表示要传入当前的对象 将3.10 lua api ...
- C++和JavaScript脚本的相互调用
脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载 ...
- Kibana启动报错 server is not ready yet的解决方案
前言: 今天在搭建elasticsearch集群的时候,再次使用Kibana操作elasticsearch的时候报告Kibana server is not ready yet的问题, 通过在 ...
- (1)python tkinter-窗体
1.导入自带的包名 import tkinter 2.创建一个窗体对象 form=Tkinter.Tk() 3.显示窗体(这句应该是所有的设置部署完最后执行的一句代码) form.mainloop() ...
- iOS开发之SceneKit框架--SCNView.h
1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...
- angluar1.8.2 PC Mail项目笔记
兼容性技术选型 前后端分离 代理gulp nginx jq+angluar1.8.2 使用级别刚刚好的相对目录,方便转移项目或者做接口代理时的切换目录 指令过滤器服务控制器书写位置 方法封装,自己写和 ...
- markdown实现页内目录跳转
1.实现页内目录跳转 语法: 页面首部添加目录:[目录](#jump_id) 页面内部锚点:<span id='jump_id'>标题</span>