JSOI2018 Day2 T1 战争

题解

  • 每次询问暴力判断时间无法满足,考虑是否可以求出使两凸包有交或无交的向量所在的范围。
  • 若两个凸包平移向量www后有交,等价于∃a∈A,b∈B,a=b+w\exists a\in A,b\in B,a=b+w∃a∈A,b∈B,a=b+w,即∃a∈A,b∈B,w=a−b\exists a\in A,b\in B, w=a-b∃a∈A,b∈B,w=a−b,则所有www的取值范围是{a−b∣a∈A,b∈B}\{a-b|a\in A,b\in B\}{a−b∣a∈A,b∈B},把bbb向量全部取反,和aaa做一遍闵可夫斯基和得到的凸包就是能使两凸包有交的向量范围(包括凸包的边)。
  • 最后只需要判断向量是否在凸包上,如果用回转数或光线投射复杂度是O(nq)O(nq)O(nq)的,可以先把凸包最左下角的点平移到(1,1)(1,1)(1,1),二分出该向量的极角序在哪两个顶点之间,然后判断该向量是否在这两个向量和(1,1)(1,1)(1,1)构成的三角形内,复杂度降为O(qlog⁡2n)O(q\log_2 n)O(qlog2​n)。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 200010
#define ld long double
#define ll long long
struct no {ll x, y, s;ld d;
}a[N], b[N], a0[N], b0[N], q[N];
int n, m, t;
ll sqr(ll x) {return x * x;
}
int cmp(no x, no y) {if(x.y == y.y) return x.x < y.x;return x.y < y.y;
}
int cmp1(no x, no y) {if(x.d == y.d) return x.s > y.s;return x.d < y.d;
}
no in(no x, no y) {return {x.x + y.x, x.y + y.y};
}
no de(no x, no y) {return {x.x - y.x, x.y - y.y};
}
ll ct(no x, no y) {return x.x * y.y - x.y * y.x;
}
void solve() {int i;sort(a + 1, a + n + 1, cmp);for(i = 2; i <= n; i++) {a[i].d = atan2(a[i].y - a[1].y, a[i].x - a[1].x);a[i].s = sqr(a[i].y - a[1].y) + sqr(a[i].x - a[1].x);}sort(a + 2, a + n + 1, cmp1);t = 1;q[1] = a[1];for(i = 2; i <= n; i++) if(i == 2 || a[i].d != a[i - 1].d) {while(t > 1 && ct(de(q[t], q[t - 1]), de(a[i], q[t])) < 0) t--;q[++t] = a[i];}
}
int main() {int Q, i;scanf("%d%d%d", &n, &m, &Q);for(i = 1; i <= n; i++) {scanf("%lld%lld", &a[i].x, &a[i].y);}for(i = 1; i <= m; i++) {scanf("%lld%lld", &b[i].x, &b[i].y);b[i].x = -b[i].x, b[i].y = -b[i].y;}solve();int at = t;for(i = 1; i <= t; i++) a0[i] = q[i];n = m;for(i = 1; i <= m; i++) a[i] = b[i];solve();int bt = t; for(i = 1; i <= t; i++) b0[i] = q[i];int tot = 0;for(i = 1; i <= at; i++) {a[++tot] = de(a0[i % at + 1], a0[i]);a[tot].d = atan2(a[tot].y, a[tot].x);if(a[tot].d < 0) a[tot].d += M_PI * 2.0;}for(i = 1; i <= bt; i++) {a[++tot] = de(b0[i % bt + 1], b0[i]);a[tot].d = atan2(a[tot].y, a[tot].x);if(a[tot].d < 0) a[tot].d += M_PI * 2.0;}sort(a + 1, a + tot + 1, cmp1);q[1] = in(a0[1], b0[1]);for(i = 1; i < tot; i++) q[i + 1] = in(q[i], a[i]);for(i = 2; i <= tot; i++) {q[i].d = atan2(q[i].y - q[1].y, q[i].x - q[1].x);}while(Q--) {no x;scanf("%lld%lld", &x.x, &x.y);x.d = atan2(x.y - q[1].y, x.x - q[1].x);if(x.d > q[tot].d || x.d < 0) {printf("0\n");continue;}int l = 1, r = tot - 1, s;while(l <= r) {int mid = (l + r) / 2;if(x.d >= q[mid].d) s = mid, l = mid + 1; else r = mid - 1;}if(ct(de(x, q[s]), de(q[s + 1], x)) <= 0) printf("1\n"); else printf("0\n");}return 0;
}

JSOI2018 Day2 T1 战争(凸包+闵可夫斯基和)相关推荐

  1. P4557 [JSOI2018]战争 凸包的闵可夫斯基和

    https://www.luogu.com.cn/problem/P4557 题目描述很简单,给定两个凸包,我们设为a,ba,ba,b,现在问给bbb凸包一个整体偏移,偏移量为k→\overright ...

  2. 洛谷 P4557 战争:凸包+闵可夫斯基和

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

  3. P4557-[JSOI2018]战争【凸包,闵可夫斯基和】

    正题 题目连接:https://www.luogu.com.cn/problem/P4557 题目大意 给出两个点集A,BA,BA,B,qqq次询问给出一个向量vvv,询问将BBB中所有点加上向量vv ...

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

    题意 给出两个凸包 A,BA,BA,B,有 qqq 次询问,每次询问给出向量 (dx,dy)(dx,dy)(dx,dy),问 BBB 所有点移动 (dx,dy)(dx,dy)(dx,dy) 是否与 A ...

  5. 跳石头 NOIP2015 提高组 Day2 T1

    codevs 4768 跳石头 题目描述 Description 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好 ...

  6. 【树链剖分】【倍增】宝石(2021GDOI Day2 T1)

    正题 luogu 7518 题目大意 给你一棵树,一条路径的价值为:路径上点权以1开始依次递增1的子序列,有q次询问,每次询问一条路径的价值 解题思路 n,m值比较大,对于每次询问只有O(log2n) ...

  7. 2019 CSP-S Day2 T1 Emiya 家今天的饭(DP)

    题目 Description Input Output 输出到文件 meal.out 中. 仅一行一个整数,表示所求方案数对 998, 244, 353 取模的结果. Sample Input Sam ...

  8. CSPS 2019 Day2 T1 Emiya 家今天的饭(容斥 + 计数 dp)

    Description 给定一个 n×mn \times mn×m 的矩阵,每一行最多选一个数,每一列可以选若干个数,但是每一列选的数不能超总数的一半.求有多少个不同的方案数. Solution 容斥 ...

  9. NOI2015 Day2 T1 荷马史诗(洛谷P2168)

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

最新文章

  1. Winform中添加客户信息
  2. 【风控术语】数字金融欺诈行为名词表
  3. 《程序员跳槽全攻略》笔记
  4. getset原子性 redis_Redis 分布式锁进化史解读 + 缺陷分析
  5. 日志组件DotNetCommon.Filelog
  6. java实现 阿拉伯数字转换为汉字数字 算法
  7. ROS笔记(22) Gmapping
  8. 微信成最频繁网络诈骗犯罪工具;库克再谈乔布斯;PyCharm 2019.2.5 发布| 极客头条...
  9. html遍历1到100,bat for循环100次:循环100求和
  10. 新机常用软件及环境配置清单
  11. 如何在团队内做技术分享
  12. 【情报分享1234】来自海莲花组织的道歉,然后再给你扔了个恶意文档
  13. 移动方块java,技术编辑教你解决Java移动方块触碰边界反弹
  14. P1308 [NOIP2011 普及组] 统计单词数
  15. 郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.2 Logistic梯度下降法...
  16. python背景色渐变_Python 生成纯色或渐变色图片
  17. SMAA算法详解 - SearchTex
  18. 2018计算机二级html,2020年全国计算机二级Web程序设计考试大纲(2018年版)
  19. 操作系统Topic推荐-AMiner
  20. Unrecognized option: --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED 解决办法

热门文章

  1. 超分辨率分割SLIC算法实现过程遇到的问题,shape mismatch: value array of shape (3,) could not be broadcast to indexing
  2. 腾讯在线文档根据单选的内容修改背景颜色
  3. JavaWeb第四天
  4. TypeScript-class学习笔记---遍历Tree
  5. 今日新闻简报 每日一份微语简报 60s读懂世界
  6. 微信新版本8.0.19新增的三个贴心实用功能您使用了吗?
  7. 高通FFBM模式退出,进Android模式
  8. Word2003、2007和2010文档隐藏回车换行符的方法
  9. 树莓派3B+绿灯四闪问题备忘
  10. 潇洒郎: python 简单安装、使用BeautifulSoup