题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包。

首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多边型在这条向量的左侧,那么我们可以根据叉积正负判断旋转的方向。

然后就是如何判断了,显然有一种情况是凸包里扣除整个多边形,那么这种情况我们需要对重合的边进行删除,可以发现,如果有重合的边,他一定是成对出现,有一条进去的边也有一条出来的边,那么我们可以直接通过vector不断插入的过程和之前那条边比较,是否是同一对点产生的边,如果是我们就直接抵消,进行下一次判断。

最后就是对这些绕着一圈的点进行判断是否是凸包,那么我们直接绕一圈判断两个向量叉积是否是小于0或者叉积等于0但是方向相反,那么这种情况也是非法。

还是有很多细节地方,此题好像eps要开大一点,不然会wa。

  1.  
  2. ans=
  3.  
  4. ans=
  1. // ——By DD_BOND
  2.  
  3. //#include<bits/stdc++.h>
  4. //#include<unordered_map>
  5. //#include<unordered_set>
  6. #include<functional>
  7. #include<algorithm>
  8. #include<iostream>
  9. //#include<ext/rope>
  10. #include<iomanip>
  11. #include<climits>
  12. #include<cstring>
  13. #include<cstdlib>
  14. #include<cstddef>
  15. #include<cstdio>
  16. #include<memory>
  17. #include<vector>
  18. #include<cctype>
  19. #include<string>
  20. #include<cmath>
  21. #include<queue>
  22. #include<deque>
  23. #include<ctime>
  24. #include<stack>
  25. #include<map>
  26. #include<set>
  27.  
  28. #define fi first
  29. #define se second
  30. #define pb push_back
  31. #define MP make_pair
  32.  
  33. using namespace std;
  34.  
  35. typedef double db;
  36. typedef long ll;
  37. typedef pair<db,db> Pd;
  38. typedef pair<int,int> P;
  39. typedef pair<ll,ll> Pll;
  40.  
  41. const db eps=1e-;
  42. const int MAXN=1e3+;
  43. const db pi=acos(-1.0);
  44. const ll INF=0x3f3f3f3f3f3f3f3f;
  45.  
  46. inline int dcmp(db x){
  47. if(fabs(x)<eps) return ;
  48. return (x>? : -);
  49. }
  50.  
  51. inline db Sqrt(db x){
  52. return x>? sqrt(x): ;
  53. }
  54.  
  55. inline db sqr(db x){ return x*x; }
  56.  
  57. struct Point{
  58. db x,y;
  59. Point(){ x=,y=; }
  60. Point(db _x,db _y):x(_x),y(_y){}
  61. void input(){
  62. double _x,_y;
  63. scanf("%lf%lf",&_x,&_y);
  64. x=_x,y=_y;
  65. }
  66. bool operator ==(const Point &b)const{
  67. return (dcmp(x-b.x)==&&dcmp(y-b.y)==);
  68. }
  69. bool operator <(const Point &b)const{
  70. return (dcmp(x-b.x)==? dcmp(y-b.y)< : x<b.x);
  71. }
  72. Point operator +(const Point &b)const{
  73. return Point(x+b.x,y+b.y);
  74. }
  75. Point operator -(const Point &b)const{
  76. return Point(x-b.x,y-b.y);
  77. }
  78. Point operator *(db a){
  79. return Point(x*a,y*a);
  80. }
  81. Point operator /(db a){
  82. return Point(x/a,y/a);
  83. }
  84. db len2(){ //长度平方
  85. return sqr(x)+sqr(y);
  86. }
  87. db len(){ //长度
  88. return Sqrt(len2());
  89. }
  90. db polar(){ //向量的极角
  91. return atan2(y,x); //返回与x轴正向夹角(-pi~pi]
  92. }
  93. Point change_len(db r){ //转化为长度为r的向量
  94. db l=len();
  95. if(dcmp(l)==) return *this; //零向量
  96. return Point(x*r/l,y*r/l);
  97. }
  98. Point rotate(Point p,db ang){ //绕点p逆时针旋转ang度
  99. Point v=(*this)-p;
  100. db c=cos(ang),s=sin(ang);
  101. return Point(p.x+v.x*c-v.y*s,p.y+v.x*s+v.y*c);
  102. }
  103. };
  104.  
  105. inline db cross(Point a,Point b){ //叉积
  106. return a.x*b.y-a.y*b.x;
  107. }
  108.  
  109. inline db dot(Point a,Point b){ //点积
  110. return a.x*b.x+a.y*b.y;
  111. }
  112.  
  113. inline db dis(Point a,Point b){ //两点的距离
  114. Point p=b-a; return p.len();
  115. }
  116.  
  117. db rad(Point a,Point b){ //两个向量的夹角
  118. return fabs(atan2(fabs(cross(a,b)),dot(a,b)));
  119. }
  120.  
  121. struct Node{
  122. Point vec,s,t;
  123. Node(){}
  124. Node(Point a,Point b,Point c){
  125. vec=a,s=b,t=c;
  126. }
  127. };
  128.  
  129. Point a[],b[],tmp[];
  130.  
  131. int main(void){
  132. int n;
  133. while(~scanf("%d",&n)){
  134. int ans=;
  135. for(int i=;i<n;i++) a[i].input(),a[i+n]=a[i];
  136. int m; scanf("%d",&m);
  137. for(int i=;i<m;i++) b[i].input(),b[i+m]=b[i];
  138.  
  139. for(int i=;i<n;i++)
  140. for(int j=;j<m;j++)
  141. if(dcmp(dis(a[i],a[i+])-dis(b[j],b[j+]))==){
  142. int p=,f=;
  143. vector<Node>st;
  144. db ang=rad(b[j+]-b[j],a[i+]-a[i]);
  145. if(dcmp(cross(b[j+]-b[j],a[i+]-a[i]))>=) ang-=pi;
  146. else ang=pi-ang;
  147.  
  148. for(int k=;k<i;k++) tmp[p++]=a[k];
  149. for(int k=j+;k<j+m+;k++) tmp[p++]=a[i+]+(b[k]-b[j]).rotate(Point(,),ang);
  150. for(int k=i+;k<n;k++) tmp[p++]=a[k];
  151.  
  152. tmp[p]=tmp[];
  153.  
  154. for(int i=;i<p;i++){
  155. Point res=tmp[i+]-tmp[i];
  156. if(st.size()&&st.back().t==tmp[i]&&st.back().s==tmp[i+]) st.pop_back();
  157. else st.pb(Node(res,tmp[i],tmp[i+]));
  158. }
  159.  
  160. st.pb(st[]);
  161. for(int i=;i<(int)st.size();i++)
  162. if(dcmp(cross(st[i-].vec,st[i].vec))<||
  163. (dcmp(cross(st[i-].vec,st[i].vec))==&&dcmp(dot(st[i-].vec,st[i].vec))<=))
  164. f=;
  165. if(!f) ans=;
  166. }
  167. printf("%d\n",ans);
  168. }
  169. return ;
  170. }

POJ 3410 Split convex polygon(凸包)的更多相关文章

  1. POJ 2007 Scrambled Polygon 凸包

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7214   Accepted: 3445 ...

  2. POJ 2007 Scrambled Polygon [凸包 极角排序]

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8636   Accepted: 4105 ...

  3. POJ 1228 Grandpa's Estate(凸包)

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11289   Accepted: 3117 ...

  4. [LeetCode] Convex Polygon 凸多边形

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  5. Leetcode: Convex Polygon

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  6. HOJ 13101 The Triangle Division of the Convex Polygon(数论求卡特兰数(模不为素数))

    The Triangle Division of the Convex Polygon 题意:求 n 凸多边形可以有多少种方法分解成不相交的三角形,最后值模 m. 思路:卡特兰数的例子,只是模 m 让 ...

  7. ACM训练联盟周赛 G. Teemo's convex polygon

    65536K   Teemo is very interested in convex polygon. There is a convex n-sides polygon, and Teemo co ...

  8. 【LeetCode】469. Convex Polygon 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算向量夹角 日期 题目地址:https://leet ...

  9. POJ 2007 Scrambled Polygon 凸包点排序逆时针输出

    题意:如题 用Graham,直接就能得到逆时针的凸包,找到原点输出就行了,赤果果的水题- 代码: /* * Author: illuz <iilluzen[at]gmail.com> * ...

随机推荐

  1. Django orm self 自关联表

    自关联模型 自关联模型就是表中的某一列,关联了这个表的另外一列.最典型的自关联模型就是地区表.省市县都在一张表里面.省的pid为null,市的pid为省的pid,县的pid为市的ID. class A ...

  2. node.js入门学习(四)--Demo图书的增删改查

    需求:图书的增删改查,图书数据保存在data.json文件中. 1.Demo结构: 2.首先下载安装node.js,配置环境变量:参考博客 3.项目初始化 1)创建项目根目录node-hello,进入 ...

  3. PHP培训教程 php几个不起眼儿的小技巧

    说是不起眼儿的小技巧,其实应该说是不常用的常规应用吧.很多事情就是这样,知道是一马事儿,会用是一马事儿,精习又是另外一马事儿.而成为高手更是需要扎实的基本功. str_repeat 重复输出字符串就靠 ...

  4. XML 简介 – 什么是 XML?

    XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 很重要,也很容易学习. <?xml version="1 ...

  5. 【Leetcode】整数反转

    题解参考:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/ 复杂度分 ...

  6. CVPR 2018 DeepGlobe

    在刚刚结束的CVPR2018: DeepGlobe Road Extraction Challenge(全球卫星图像道路提取)比赛中,北京邮电大学信息与通信工程学院模式识别实验室张闯老师指导的研究生周 ...

  7. Android系统关机或重启的几种实现方式

    前阵子工作上遇到一些关于Android系统关机或重启的系统修改,于是,做了一些尝试,也搜集了一下资料,现在整理一下,做一些总结,方便学习或者日后工作的需要. 默认的SDK并没有提供应用开发者直接的An ...

  8. 前端每日实战:161# 视频演示如何用纯 CSS 创作一张纪念卓别林的卡片(没有笑声的一天就是被荒废的一天)

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WaaBNV 可交互视频 此视频是可 ...

  9. 关于Qt 构建套件(Kit) 编译器 自动识别不正确 不能修改的问题

    当系统内有多个Qt的版本的时候,QtCreater会自动识别出 编译器,Qt版本,和构建套件(Kit),但是有时候会发现,识别出来的路径不对,而且不能修改. 当出现这是问题的时候,可以到 qtcrea ...

  10. legend3---2、网站的代码里面的/也是代表根目录

    legend3---2.网站的代码里面的/也是代表根目录 一.总结 一句话总结: 不过这个根目录在public下面 1.mysql删除数据库命令? drop database <数据库名> ...