题目描述

九条可怜是一个热爱读书的女孩子。

在她最近正在读的一本小说中,描述了两个敌对部落之间的故事。第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 (xi,yi)(x_i,y_i)(xi​,yi​) 的点。

在这本书中,人们有很强的领地意识,对于平面上的任何一个点,如果它被三个来自同一部落的人形成的三角形(可能退化成一条线段)包含(包括边界),那么这一个点就属于这一个部落的领地。如果存在一个点同时在两个阵营的领地中,那么这两个部落就会为了争夺这一个点而发生战争。

常年的征战让两个部落不堪重负,因此第二个部落的族长作出了一个英明的决定,他打算选择一个向量 (dx,dy)(dx,dy)(dx,dy) ,让所有的族人都迁徙这个向量的距离,即所有第二阵营的人的坐标都变成 (xi+dx,yi+dy)(x_i+dx,y_i+dy)(xi​+dx,yi​+dy) 。

现在他计划了 qqq 个迁徙的备选方案,他想要你来帮忙对每一个迁徙方案,计算一下在完成了迁徙之后,两个部落之间还会不会因为争夺领地而发生战争。

输入格式

第一行输入三个整数 n,m,qn,m,qn,m,q,表示两个部落里的人数以及迁徙的备选方案数。

接下来 nnn 行每行两个整数 xi,yix_i,y_ixi​,yi​​​ 表示第一个部落里的人的坐标。

接下来 mmm 行每行两个整数 xi,yix_i,y_ixi​,yi​​​ 表示第二个部落里的人的坐标。

接下来 qqq 行每行两个整数 dxi,dyidx_i,dy_idxi​,dyi​​​ 表示一个迁徙方案。

输入数据保证所有人的坐标两两不同。

输出格式

对于每个迁徙方案,输出一行一个整数,000 表示不会发生冲突,111 表示会发生冲突。

输入输出样例

输入 #1

  1. 4 4 3
  2. 0 0
  3. 1 0
  4. 0 1
  5. 1 1
  6. -1 0
  7. 0 3
  8. 0 2
  9. 0 -1
  10. 0 0
  11. 2 3
  12. 0 -1
输出 #1
1
0
设a,b为两个部落构成的凸包
b+d=a等价于d=a-b
即取反b,求出凸包,再用Minkowski和合并两凸包
查询用二分查询向量d所在区间,用叉积判断是否在凸包内
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long lol;
  7. struct Node
  8. {
  9. lol x,y;
  10. Node operator + (const Node &b) const
  11. {
  12. return (Node){x+b.x,y+b.y};
  13. }
  14. Node operator - (const Node &b) const
  15. {
  16. return (Node){x-b.x,y-b.y};
  17. }
  18. }a[],b[],sa[],sb[],sta[],bs,s1[],s2[],s[];
  19. int n,m,q,top;
  20. bool cmp(Node a,Node b)
  21. {
  22. if (a.y==b.y) return a.x<b.x;
  23. return a.y<b.y;
  24. }
  25. lol cross(Node a,Node b)
  26. {
  27. return (a.x*b.y-a.y*b.x);
  28. }
  29. lol dist(Node a)
  30. {
  31. return a.x*a.x+a.y*a.y;
  32. }
  33. bool cmp1(Node A,Node B)
  34. {
  35. lol t=cross((a[]-A),(a[]-B));
  36. if (t==) return dist(a[]-A)<dist(a[]-B);
  37. return t>;
  38. }
  39. bool cmp2(Node A,Node B)
  40. {
  41. lol t=cross((b[]-A),(b[]-B));
  42. if (t==) return dist(b[]-A)<dist(b[]-B);
  43. return t>;
  44. }
  45. int grahama(int N)
  46. {int i;
  47. sort(a+,a+N+,cmp);
  48. sort(a+,a+N+,cmp1);
  49. top=;
  50. sa[++top]=a[];
  51. if (N==) return ;
  52. sa[++top]=a[];
  53. for (i=;i<=N;i++)
  54. {
  55. while (top>&&cross(a[i]-sa[top-],sa[top]-sa[top-])>=) top--;
  56. top++;
  57. sa[top]=a[i];
  58. }
  59. sa[top+]=a[];
  60. return top;
  61. }
  62. int grahamb(int N)
  63. {int i;
  64. sort(b+,b+N+,cmp);
  65. sort(b+,b+N+,cmp2);
  66. top=;
  67. sb[++top]=b[];
  68. if (N==) return ;
  69. sb[++top]=b[];
  70. for (i=;i<=N;i++)
  71. {
  72. while (top>&&cross(b[i]-sb[top-],sb[top]-sb[top-])>=) top--;
  73. top++;
  74. sb[top]=b[i];
  75. }
  76. sb[top+]=b[];
  77. return top;
  78. }
  79. bool cmpp(Node A,Node B)
  80. {
  81. lol t=cross((s[]-A),(s[]-B));
  82. if (t==) return dist(s[]-A)<dist(s[]-B);
  83. return t>;
  84. }
  85. int grahams(int N)
  86. {int i;
  87. sort(s+,s+N+,cmp);
  88. sort(s+,s+N+,cmpp);
  89. top=;
  90. sta[++top]=s[];
  91. if (N==) return ;
  92. sta[++top]=s[];
  93. for (i=;i<=N;i++)
  94. {
  95. while (top>&&cross(s[i]-sta[top-],sta[top]-sta[top-])>=) top--;
  96. top++;
  97. sta[top]=s[i];
  98. }
  99. sta[top+]=s[];
  100. return top;
  101. }
  102. bool cmp3(Node A,Node B)
  103. {
  104. return cross(A,B)>||(cross(A,B)==&&dist(A)<dist(B));
  105. }
  106. lol find(Node A)
  107. {
  108. if(cross(A,sta[])>||cross(sta[top],A)>) return ;
  109. lol ps=lower_bound(sta+,sta+top+,A,cmp3)-sta-;
  110. return cross((A-sta[ps]),(sta[ps%top+]-sta[ps]))<=;
  111. }
  112. void Minkowski()
  113. {
  114. for(lol i=;i<n;i++) s1[i]=sa[i+]-sa[i];s1[n]=sa[]-sa[n];
  115. for(lol i=;i<m;i++) s2[i]=sb[i+]-sb[i];s2[m]=sb[]-sb[m];
  116. top=;
  117. s[top]=sa[]+sb[];
  118. lol i=,j=;
  119. while(i<=n&&j<=m) ++top,s[top]=s[top-]+(cross(s1[i],s2[j])>=?s1[i++]:s2[j++]);
  120. while(i<=n) ++top,s[top]=s[top-]+s1[i++];
  121. while(j<=m) ++top,s[top]=s[top-]+s2[j++];
  122. }
  123. int main()
  124. {int i,j;
  125. lol dx,dy;
  126. cin>>n>>m>>q;
  127. for (i=;i<=n;i++)
  128. scanf("%lld%lld",&a[i].x,&a[i].y);
  129. for (i=;i<=m;i++)
  130. scanf("%lld%lld",&b[i].x,&b[i].y),b[i].x=-b[i].x,b[i].y=-b[i].y;
  131. n=grahama(n);
  132. m=grahamb(m);
  133. Minkowski();
  134. top=grahams(top);
  135. bs=sta[];
  136. for (i=;i<=top;i++)
  137. sta[i]=sta[i]-bs;
  138.  
  139. for (i=;i<=q;i++)
  140. {
  141. scanf("%lld%lld",&dx,&dy);
  142. if (find((Node){dx,dy}-bs))
  143. printf("1\n");
  144. else printf("0\n");
  145. }
  146. }

[JSOI2018]战争的更多相关文章

  1. P4557 [JSOI2018]战争

    首先可以题目描述的两个点集是两个凸包,分别设为A和B. 考虑一个向量w不合法的条件. 即存在b+w=a,其中a属于A,b属于B. 也就是a-b=w. 即对b取反后和a的闵可夫斯基和. 求出闵可夫斯基和 ...

  2. BZOJ5317:[JSOI2018]战争(闵可夫斯基和)

    令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...

  3. 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)

    题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...

  4. [JSOI2018]战争(闵可夫斯基和)

    害怕,可怜几何题 果然不会 题目就是说给你两个凸包,每次询问给你一个向量 \(c\) 问你能不能从两个凸包 \(A\) , \(B\) 里分别找到一个点 \(a\) , \(b\) 满足 \(a+c= ...

  5. 【LuoguP4557】[JSOI2018]战争

    题目链接 题意 给你两个点集. q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交. Sol 闵可夫斯基和板子题. 把问题做如下转换: 我们本来两个凸包相交是相当于是对于移 ...

  6. 计算几何细节梳理&模板

    点击%XZY巨佬 向量的板子 #include<bits/stdc++.h> #define I inline using namespace std; typedef double DB ...

  7. HHHOJ #151. 「NOI模拟 #2」Nagisa

    计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...

  8. 【学习笔记】Minkowski和

    这还是个被我咕了N久的玩意 Minkowski和是一个奇怪的玩意 他长这样 $S={a+b \| a \in A , b \in B}$ AB可以是点集也可是向量集(显然) 他可以处理一些奇怪的东西 ...

  9. JSOI部分题解

    JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...

随机推荐

  1. 40 多线程(十二)——ReentrantLock 可重入锁

    我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...

  2. Django视图基类

    Django视图基类 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 一 .视图 REST framework 提供 ...

  3. python_二叉树简单实现

    今日头条面试题,先做下: 二叉树代码实现 class Node: def __init__(self,item): self.item = item self.child1 = None self.c ...

  4. springboot笔记05——profile多环境配置切换

    前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要 ...

  5. CMake配置VTK时Qt5_DIR-NOTFOUND的解决方法

    直接给解决方法了,不废话. Qt5的路径,请参考:C:\Program\IDE\Qt\Qt5.13.0\5.13.0\msvc2017_64\lib\cmake\Qt5 参考文章 CMake配置VTK ...

  6. php后台实现页面跳转的方法-转载

    地址:http://blog.csdn.net/abandonship/article/details/6459104 其中方法三的js代码在tp框架使用存在故障,一个是需要把代码写在一起(可能也不需 ...

  7. css设置图片百分比显示,最简洁的代码

    css代码: .img-box { padding-bottom: 100%; } .img-box img { position: absolute; top:; bottom:; left:; r ...

  8. 过滤器+用session验证是否登陆过

    过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override ...

  9. IntelliJ Idea 依赖包下载成功,代码里无法import问题解决方法

    今天clone一个github上的基于maven的项目IntelliJ Idea 依赖包下载成功,代码里无法import.解决方法:删掉原来的.iml,刷新. 如果不行,可尝试:File->In ...

  10. HashMap,HashSet

    HashMap,HashSet 摘自:https://www.cnblogs.com/skywang12345/p/3310887.html#a1 目录 一.    HashMap(键值对形式存取,键 ...