题意:

给出两个凸包AAA和BBB,有若干询问,每次给出一个向量V=(x,y)V = (x,y)V=(x,y),将BBB按照VVV的方向平移到B′B'B′,然后回答AAA和B′B'B′是否相交。

题解:

题目的条件等价于 存在点a,ba,ba,b,其中a∈A,b∈Ba\in A, b \in Ba∈A,b∈B,且满足a=b+Va = b + Va=b+V。
则得到等价条件V=a−bV = a - bV=a−b。
即VVV要在AAA与−B-B−B的闵可夫斯基和中。
显然−B-B−B也是一个凸包,因此我们只需要求两个凸包的闵可夫斯基和
而两个凸包的闵可夫斯基和也一定是个凸包,而且这个新凸包的每条边(看作向量),一定是原来两个凸包的边(看作向量)。实际上就是归并转一下两个凸包就行了
然后判断点在凸包内。
算是做的第一道真正意义的计算几何题吧。。。太菜了。。。

Code:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 50;
template<class type>
struct point{type x,y;point(){};point(type x_,type y_):x(x_),y(y_){}point operator +(const point &p)const {return point(x + p.x,y + p.y);}point operator -(const point &p)const {return point(x - p.x,y - p.y);}//a related to b//clockwise : positive//anti-clockwise : negative//share a line : zerotype cross(const point &p)const {return x * p.y - y * p.x;}type dot(const point &p)const {return x * p.x + y * p.y;}type cross(const point &a,const point &b)const {return (a - *this).cross(b - *this);}type dot(const point &a,const point &b)const {return (a - *this).dot(b - *this);}type sqrLen()const{return this->dot(*this);}type sqrDis(const point &p)const {return (p - *this).sqrLen();}
};
typedef point<long long> pt;
namespace Geometry{const double PI = acos(-1.0);//res[0]: left most and bottom most//anti-clockwise//no three points share one line//WARN: this function modifies pointsvector<pt> Convex_Hull(vector<pt> &points){vector<pt> res(0);assert(points.size() >= 3);int idx = 0;for (int i=1;i<points.size();i++){pt temp = points[i];pt now = points[idx];if (temp.x < now.x || temp.x == now.x && temp.y < now.y)idx = i;}swap(points[idx],points[0]);sort(points.begin()+1,points.end(),[&](pt x,pt y){double cro = points[0].cross(x,y);if (cro != 0)return cro > 0;return points[0].sqrDis(x) < points[0].sqrDis(y);});res.push_back(points[0]);res.push_back(points[1]);for (int i=2;i<points.size();i++){pt now = points[i];while (res.size() >= 2){double cro = res[res.size()-2].cross(now,res.back());auto p = res[res.size()-2];auto pp = res.back();if (cro >= 0)res.pop_back();else break;}res.push_back(now);}return res;}//calc the Minkowski Sum of two Convex Hullvector<pt> Minkowski(const vector<pt> &ch1,const vector<pt> &ch2){assert(ch1.size() >= 3);assert(ch2.size() >= 3);stack<pt> vec1;stack<pt> vec2;for (int i = ch1.size() - 1;i >=0;i--){vec1.push(ch1[(i+1)%ch1.size()] - ch1[i]);}for (int i = ch2.size() - 1;i >= 0;i--){vec2.push(ch2[(i+1)%ch2.size()] - ch2[i]);}vector<pt> res(0);res.push_back(ch1.front() + ch2.front());while (!vec1.empty() && !vec2.empty()){auto v1 = vec1.top();auto v2 = vec2.top();long long cro = v1.cross(v2);if (cro > 0){res.push_back(res.back() + v1);vec1.pop();}else{res.push_back(res.back() + v2);vec2.pop();}}while (!vec1.empty())res.push_back(res.back() + vec1.top()),vec1.pop();while (!vec2.empty())res.push_back(res.back() + vec2.top()),vec2.pop();return Convex_Hull(res);}//logn//wether point in or on convex hullbool within(pt p,const vector<pt> &ch){assert(ch.size() >= 3);auto base = ch.front();if (base.cross(p,ch[1]) > 0 || base.cross(p,ch.back()) < 0)return false;if (base.cross(p,ch[1]) == 0 && (p - base).sqrLen() <= (ch[1] - base).sqrLen())return true;auto cmp = [&](const pt x,const pt y){long long cro = base.cross(x,y);return cro>0;};int i = lower_bound(ch.begin(),ch.end(),p,cmp) - ch.begin() - 1;int j = i+1;assert(j < ch.size());return ch[i].cross(ch[j],p) >= 0;}
};
int n,m,q;int main(){cin>>n>>m>>q;vector<pt> pa,pb;for (int i=0;i<n;i++){int x,y;cin>>x>>y;pa.push_back(pt(x,y));}for (int i=0;i<m;i++){int x,y;cin>>x>>y;x *= -1;y *= -1;pb.push_back(pt(x,y));}pa = Geometry::Convex_Hull(pa);pb = Geometry::Convex_Hull(pb);vector<pt> sum = Geometry::Minkowski(pa,pb);while (q--){int x,y;cin>>x>>y;if (Geometry::within(pt(x,y),sum)){cout<<1<<endl;}else{cout<<0<<endl;}}return 0;
}

洛谷 P4557 战争:凸包+闵可夫斯基和相关推荐

  1. [洛谷P3262]战争调度

    题目 传送门 to luogu 思路 编程要从娃娃抓起,dp\tt{dp}dp 要从叶节点搞起. 毕竟 每个叶节点之间是相互独立的,并且贡献只与其祖先("祖先"不包括自己,下同)有 ...

  2. 洛谷:P2172 [国家集训队]部落战争

    题目链接: P2172 [国家集训队]部落战争 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解题思路: 很明显的二分图:将原点与它能走到的点连一条边,然后做一遍最小点覆盖:即选出 ...

  3. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  4. 旋转卡壳简介(POJ2187)(洛谷P1452)

    读音 word上是这么读的: 前置技能 凸包 算法用途 旋转卡壳可以在O(n)O(n)O(n)的时间内确定一对对踵点对,它的用途包括但不限于:计算距离(凸多边形直径).计算外接矩形(最小面积/周长). ...

  5. 洛谷 CF311B Cats Transport

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 CF311B Cats Transport 题目 题目描述 Zxr960115 is owner of a large farm. H ...

  6. 洛谷P1007——独木桥 解法 (C++)

    Hi 又见面了呀 今天来一道洛谷的题 独木桥 先上个题目传送门(点击蓝字即可观看) 注:该博客已在2020年6月24日更新,更新内容:修复了一些由于字体原因导致的错误 题目背景 战争已经进入到紧要时间 ...

  7. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  8. 洛谷 P1196 银河英雄传说

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  9. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

最新文章

  1. python os system用法_Python调用系统命令os.system()和os.popen()的实现
  2. jquery div拖动效果示例代码
  3. 洛谷P1880 [NOI1995]石子合并
  4. 41. 缺失的第一个正数 golang
  5. 深入理解计算机系统 相关课程,深入理解计算机系统
  6. 移动开发—媒体查询(Media Query)
  7. pythonATM,购物车项目实战3-视图函数
  8. CommandLineToArgvW
  9. 接口与抽象类的区别和相同点
  10. Java并发包实际应用_Java并发包之核心AQS
  11. windows服务启动tomcat内存溢出问题解决方案
  12. vs哪个版本好用_5个版本17款白金爱他美,究竟选哪个?德国版/澳洲版/卓萃/英国.....
  13. 「硬刚Doris系列」Apache Doris的向量化和Roaring BitMap
  14. Python GUI编程—Tkinter实战一(生日快乐小程序)
  15. 计算机地址怎么填写,电脑服务器名称或地址怎么填
  16. ArcGIS中计算点与线之间距离的两种方法
  17. [分享]敏感内容自动评审类库及辅助工具
  18. js 下载Base64格式数据图片(兼容主流浏览器)
  19. 为什么我要用GoEasy替代WebSocket
  20. 提高自己情商的五个关键

热门文章

  1. 如何在Mac上清理磁盘空间?这些方法你用过了吗
  2. Power BI----数据处理
  3. 163个人邮箱怎么注册申请,电子邮箱免费注册,电子邮件管理大全
  4. 有关GB18030编码来由的传说
  5. 【Linux】Linux常用命令
  6. DataStage函数大全
  7. 【开心一刻】程序员上了“天堂”后,是一种什么感悟?!
  8. linux管道、重定向和查看命令
  9. OJ 趣味程序设计_三色球问题
  10. OpenGL学习笔记(十)-几何着色器-实例化