两个凸包判断经过旋转平移能否重合。
我一看。哇傻逼题十行秒掉。
交上去跑的飞快然后wa55。
。。。
然后这个题一共就55个点,这网友的数据竟该死的强。
看了眼数据是两个反转的平行四边形,再判下角度就好了。
怎么大家都在hash然后kmp啊。这好难啊。我根本不会这东西啊。。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#include <deque>
#include <cstring>#define rep(n) for(int i=0;i<n;i++)
using namespace std;
typedef double db;
const db eps=1e-6;
const db pi=acos(-1);
int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; return 0;
}
int cmp(db k1,db k2){return sign(k1-k2);}
struct point{db x,y;point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}point operator * (db k1) const{return (point){x*k1,y*k1};}point operator / (db k1) const{return (point){x/k1,y/k1};}bool operator < (const point k1) const{int a=cmp(x,k1.x);if (a==-1) return 1; else if (a==1) return 0; else return cmp(y,k1.y)==-1;}int operator == (const point &k1) const{return cmp(x,k1.x)==0&&cmp(y,k1.y)==0;}db abs(){return sqrt(x*x+y*y);}db dis(point k1){return ((*this)-k1).abs();}int dis2(point k1){ return (dis(k1)*dis(k1));}point unit(){db w=abs(); return point{x/w,y/w};}point turn90(){ return point{-y,x};}db getP()const { return sign(y)==1||(sign(y)==0&&sign(x)==-1);}void print(){printf("%.11lf %.11lf\n",x,y);}
};
db cross(point k1,point k2){ return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){ return k1.x*k2.x+k1.y*k2.y;}
db rad(point k1,point k2){ return atan2(cross(k1,k2),dot(k1,k2));}
int compareangle(point k1,point k2){return k1.getP()<k2.getP()||(k1.getP()==k2.getP()&&sign(cross(k1,k2))>0);
}
point getLL(point k1,point k2,point k3,point k4){db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3);return (k1*w2+k2*w1)/(w1+w2);
}
struct line{point p[2];line(point k1,point k2){p[0]=k1;p[1]=k2;}point &operator[](int k){ return p[k];}int include(point k){ return sign(cross(p[1]-p[0],k-p[0])>0);}point dir(){ return p[1]-p[0];}line push(db eps){//向左手边平移eps//const db eps=1e-6;point delta=(p[1]-p[0]).turn90().unit()*eps;return {p[0]-delta,p[1]-delta};}
};
point getLL(line k1,line k2){return getLL(k1[0],k1[1],k2[0],k2[1]);
}
int parallel(line k1,line k2){ return sign(cross(k1.dir(),k2.dir()))==0;}
int sameDir(line k1,line k2){return parallel(k1,k2)&&sign(dot(k1.dir(),k2.dir()))==1;
}
int operator <(line k1,line k2){if(sameDir(k1,k2))return k2.include(k1[0]);return compareangle(k1.dir(),k2.dir());
}
int checkpos(line k1,line k2,line k3){ return k3.include(getLL(k1,k2));}
vector<point> convexHull(vector<point>ps){int n = ps.size();if(n<=1)return ps;sort(ps.begin(),ps.end());vector<point> qs(n*2);int k=0;for(int i=0;i<n;qs[k++]=ps[i++])while (k>1&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;for(int i=n-2,t=k;i>=0;qs[k++]=ps[i--])while (k>t&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;qs.resize(k-1);return qs;
}
vector<point> a,b;
int n,m;point o1,o2;
int main(){scanf("%d%d",&n,&m);a.resize(n);b.resize(m);rep(n)scanf("%lf%lf",&a[i].x,&a[i].y);rep(m)scanf("%lf%lf",&b[i].x,&b[i].y);a=convexHull(a);b=convexHull(b);if(a.size()!=b.size()){cout<<"NO"<<endl;return 0;}n=a.size();rep(n)o1=o1+a[i],o2=o2+b[i];o1=o1/n;o2=o2/n;rep(n)a[i]=a[i]-o1;rep(n)b[i]=b[i]-o2;sort(a.begin(),a.end(),compareangle);sort(b.begin(),b.end(),compareangle);rep(n){bool f=1;db pre=-1;for(int j=0;j<n&&f;j++){if(cmp(a[j].abs(),b[(i+j)%n].abs())!=0)f=0;db now = rad(a[j],b[(i+j)%n]);if(pre==-1)pre=fabs(now);else if(cmp(fabs(now),pre))f=0;}if(f){cout<<"YES"<<endl;return 0;}}cout<<"NO"<<endl;
}

转载于:https://www.cnblogs.com/MXang/p/11342570.html

codeforces 1017E相关推荐

  1. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  2. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  3. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  4. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  5. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  6. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  7. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  8. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  9. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

最新文章

  1. wordpress acf字段 不同样式_WordPress强大搜索功能如何实现?安装Ivory Search插件
  2. 哥伦比亚大学AI实验室主任Hod Lipson:阻碍无人驾驶技术发展的7个误区
  3. 如何让Web.xml变得简洁?
  4. Spring Boot(二)应用实例
  5. halcon File文件算子,持续更新
  6. 虚拟机游戏获取服务器地址,vue获取服务器地址
  7. [转载]使用命名管道实现进程间通信
  8. python widnows mysql_Windows下python安装MySQLdb
  9. Centos5.11 使用yum源
  10. svn外网虚拟服务器设置,svn虚拟服务器设置路由器设置
  11. 概率论:p(x|theta)和p(x;theta)的区别
  12. Uploadify 控件上传图片 + 预览
  13. 分享Silverlight/WPF/Windows Phone一周学习导读(10月22日-10月29日)
  14. 上海世博会物联网技术应用
  15. 阿里云国际版短信发送
  16. ubuntu 19.04下交叉编译64位vlc 3.0.8
  17. Unity5权威讲解 笔记
  18. 简述Android操作系统和IOS系统的区别;
  19. wannier插值能带拟合3
  20. “添翼杯”人工智能创新应用大赛之垃圾分类

热门文章

  1. 一些linux知识和http知识
  2. Linux Tomcat 6.0安装配置实践总结
  3. iphone开发中数据持久化之——属性列表序列化(一)
  4. JUnit3 一次运行多个测试类和进行多次重复测试:使用测试套件和RepeatedTest
  5. Android内核剖析
  6. 系统带你学习 WebAPIs 第五讲
  7. 《JavaScript》高级程序设计---第3章
  8. Laravel框架中的路由和控制器
  9. 响应式网页布局 - W3Schools How-Tos 01
  10. SQL server中DateTime类型字段如何赋值零?