Codeforces 1017E The Supersonic Rocket 凸包,计算几何,字符串,KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1017E.html
题目传送门 - CF1017E
题意
给定两个点集,并构成两个凸包。
问这两个凸包是否可以通过旋转和平移重合。
每一个凸包的点数 $\leq 10^5$ 。
题解
建两个凸包,注意一下,建出来的凸包要避免凸包外围连续三点共线。
然后把每一个凸包的边长、拐角信息记录下来,形成一个序列,判断两个凸包对应的序列是否循环同构即可。注意一下拐角信息不能只存叉积。
例如赛后加上的第 55 组数据: 4 0 0 1 0 1 1 2 1 0 1 1 1 2 0 1 0
判断字符串循环同构:倍长一个串,另一个在上面 kmp 。
注意一下并不是匹配了就可以了,要保证匹配的位置为一个信息块的结尾。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=600005;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
int n,m;
struct Point{
int x,y;
}p1[N],p2[N],O;
LL sqr(int x){
return 1LL*x*x;
}
LL dis(Point a,Point b){
return sqr(a.x-b.x)+sqr(a.y-b.y);
}
LL cross(Point a,Point b,Point c){
return 1LL*(b.x-a.x)*(c.y-a.y)-1LL*(c.x-a.x)*(b.y-a.y);
}
bool cmp_O(Point a,Point b){
if (a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
bool cmp_Angle(Point a,Point b){
LL c=cross(O,a,b);
if (c==0)
return dis(O,a)<dis(O,b);
return c>0;
}
int st[N],top;
int Make_Convex(Point P[],int n){
for (int i=2;i<=n;i++)
if (!cmp_O(P[1],P[i]))
swap(P[1],P[i]);
O=P[1];
sort(P+2,P+n+1,cmp_Angle);
top=0;
st[++top]=1,st[++top]=2;
for (int i=3;i<=n;i++){
while (top>=2&&cross(P[st[top-1]],P[st[top]],P[i])<=0)
top--;
st[++top]=i;
}
for (int i=1;i<=top;i++)
P[i]=P[st[i]];
return top;
}
LL s1[N],s2[N];
int Fail[N];
void KMP(LL s[],int n){
Fail[0]=Fail[1]=0;
for (int i=2;i<=n;i++){
int k=Fail[i-1];
while (k>0&&s[i]!=s[k+1])
k=Fail[k];
Fail[i]=k+(s[k+1]==s[i]?1:0);
}
}
bool check(){
int k=0;
for (int i=1;i<=n*6;i++){
while (k>0&&s2[k+1]!=s1[i])
k=Fail[k];
if (s2[k+1]==s1[i])
k++;
if (k>=m*3){
if (i%3==0)
return 1;
else
k=Fail[k];
}
}
return 0;
}
int main(){
n=read(),m=read();
for (int i=1;i<=n;i++)
p1[i].x=read(),p1[i].y=read();
for (int i=1;i<=m;i++)
p2[i].x=read(),p2[i].y=read();
n=Make_Convex(p1,n);
m=Make_Convex(p2,m);
for (int i=1;i<=n;i++){
s1[i*3-2]=dis(p1[i],p1[i%n+1]);
s1[i*3-1]=cross(p1[i],p1[i%n+1],p1[(i+1)%n+1]);
s1[i*3]=dis(p1[i],p1[(i+1)%n+1]);
}
for (int i=1;i<=m;i++){
s2[i*3-2]=dis(p2[i],p2[i%m+1]);
s2[i*3-1]=cross(p2[i],p2[i%m+1],p2[(i+1)%m+1]);
s2[i*3]=dis(p2[i],p2[(i+1)%m+1]);
}
for (int i=1;i<=n*3;i++)
s1[i+n*3]=s1[i];
KMP(s2,m*3);
puts(n==m&&check()?"YES":"NO");
return 0;
}
Codeforces 1017E The Supersonic Rocket 凸包,计算几何,字符串,KMP的更多相关文章
- CodeForces - 1017E :The Supersonic Rocket (几何+KMP,判定凸包是否同构)
After the war, the supersonic rocket became the most common public transportation. Each supersonic r ...
- hdu 5510 Bazinga(字符串kmp)
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu1686字符串kmp
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- 模板—字符串—KMP(单模式串,单文本串)
模板—字符串—KMP(单模式串,单文本串) Code: #include <cstdio> #include <cstring> #include <algorithm& ...
- E. The Supersonic Rocket Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)
http://codeforces.com/contest/1017/problem/E 凸包模板+kmp #include <cstdio> #include <cstdlib&g ...
- Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) E. The Supersonic Rocket
这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能 ...
- bzoj 1964: hull 三维凸包 计算几何
1964: hull 三维凸包 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 54 Solved: 39[Submit][Status][Discuss ...
- [codeforces/gym/101350/L]维护“凸包”
题目链接:http://codeforces.com/gym/101350/problems 给定n个墙,每个墙有一个高度,要支持动态修改墙的高度和查询这个“容器”能盛多少水. (队友)观察发现,能盛 ...
- HDU 1392 Surround the Trees(凸包*计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 这里介绍一种求凸包的算法:Graham.(相对于其它人的解释可能会有一些出入,但大体都属于这个算 ...
随机推荐
- Python 生产者与消费者模型
定义: 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生 ...
- Confluence 6 数据库整合有关你数据库的大小写敏感问题
'Collation' 是数据如何被存储和比较的规则.大小写是否敏感是有关字符集设置的一个方面.其他大小写敏感的方面有 kana (Japanese script)和宽度(单字节对比双字节长度). 设 ...
- Confluence 6 查看你的许可证细节
希望查看你的 Confluence 许可证: 进入 > 基本配置(General Configuration). 在左侧的面板中选择 许可证详细(License Details). 你的许可证 ...
- 为什么在移动端用rem圆角不圆
rem是根据网页效果图的尺寸来计算的,当然还要借助媒体查询来完成.例如你的设计稿如果是宽720px的话,那你的文字就要以原始大小除以11.25,就是对应下面媒体查询720px:例如16px的话就要16 ...
- gnuradio 初次使用
参考链接: 入门 http://www.cnblogs.com/moon1992/p/5739027.html 创建模块 http://www.cnblogs.com/moon1992/p/54246 ...
- requests 的基本用法
r = requests.get('www.baidu.com') r.request.headers{'User-Agent': 'python-requests/2.18.4', 'Accept- ...
- 给div拼接html 拼接字符串
简单描述:拼接html 拼接字符串,说实话,拼接这种东西我自己弄,得花费很多时间,主要是转义字符,单引号,双引号这种小细节调整起来比较麻烦,一旦疏忽多了少了一个符号,页面就有点抽象了,我呢比较粗枝大叶 ...
- laravel 频率限制throttle
在 Laravel 5.6 中,还引入了频率限制功能.所谓频率限制,指的是在指定时间单个用户对某个路由的访问次数限制,该功能有两个使用场景,一个是在某些需要验证/认证的页面限制用户失败尝试次数,提高系 ...
- hdu1540 区间合并+询问某点的最大连续块
询问操作需要搞一下 今天被区间合并降智了 /* D a: 摧毁第a个点 Q a:询问a所在的点的块大小 R :修复最后被破坏的点 对于所有的点需要进行一次更新 更新比较容易,tag用来表示区间是否是完 ...
- The.Glory.of.Innovation 创新之路3放飞好奇
教育最重要的就是 问题不在于教他各种学问,而在于培养他爱好学问的兴趣,而且在这种兴趣充分增长起来的时候,教他以研究学问的方法. ———— 卢梭 如何辨识不同的观点, 老师考查的重点不在于学生 ...