求出重心,然后把所有点关于重心极角排序,极角相同的按到重心距离从大到小排序。

按极角序依次扫描,得到相邻两个向量的夹角以及长度之比,看成字符串。

若两个字符串循环同构,则两个点集相似,KMP判断即可。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=25010;
const double eps=1e-10;
int T,l,i,j,k,nxt[N];
inline int sgn(double x){
if(x<-eps)return -1;
if(x>eps)return 1;
return 0;
}
struct P{
double x,y,o;
P(){}
P(double _x,double _y){x=_x,y=_y;}
P operator+(const P&b){return P(x+b.x,y+b.y);}
P operator-(const P&b){return P(x-b.x,y-b.y);}
P operator/(double b){return P(x/b,y/b);}
bool operator==(const P&b){return !sgn(x-b.x)&&!sgn(y-b.y);}
bool operator!=(const P&b){return sgn(x-b.x)||sgn(y-b.y);}
void cal(){o=atan2(y,x);}
double operator*(const P&b){return x*b.x+y*b.y;}
double len(){return sqrt(x*x+y*y);}
double lensqr()const{return x*x+y*y;}
}a[N],b[N],O;
inline bool cmp(const P&a,const P&b){
if(!sgn(a.o-b.o))return a.lensqr()>b.lensqr();
return a.o<b.o;
}
struct Set{
int n,m;P f[N];
void init0(){
n=l;
for(i=0;i<n;i++)a[i]=b[i];
}
void init1(){
n=l;
for(i=0;i<n;i++)a[i]=b[i],a[i].x*=-1;
}
void init(){
O=P(0,0);
for(i=0;i<n;i++)O=O+a[i];
O=O/((double)n);
for(i=j=m=0;i<n;i++)if(a[i]==O)m++;else a[j++]=a[i];
n=j;
for(i=0;i<n;i++)a[i]=a[i]-O,a[i].cal();
if(!n)return;
sort(a,a+n,cmp);
a[n]=a[0];
for(i=0;i<n;i++)f[i]=P(a[i]*a[i+1]/a[i].len()/a[i+1].len(),a[i].len()/a[i+1].len());
for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){
while(~j&&f[j+1]!=f[i])j=nxt[j];
if(f[j+1]==f[i])j++;
}
}
}A,B;
void init(){
scanf("%d",&l);
for(i=0;i<l;i++)scanf("%lf%lf",&b[i].x,&b[i].y);
}
bool check(){
if(A.n!=B.n||A.m!=B.m)return 0;
if(!A.n)return 1;
for(j=-1,k=0;k<2;k++)for(i=0;i<A.n;i++){
while(~j&&B.f[j+1]!=A.f[i])j=nxt[j];
if(B.f[j+1]==A.f[i]){
j++;
if(j==A.n-1)return 1;
}
}
return 0;
}
int main(){
init();
A.init0();
A.init();
scanf("%d",&T);
while(T--){
init();
B.init0();
B.init();
if(check()){puts("TAK");continue;}
B.init1();
B.init();
puts(check()?"TAK":"NIE");
}
return 0;
}

  

BZOJ1527 : [POI2005]Pun-point的更多相关文章

  1. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  2. [BZOJ1529][POI2005]ska Piggy banks

    [BZOJ1529][POI2005]ska Piggy banks 试题描述 Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个存钱罐的钥匙放 ...

  3. 【BZOJ】【1532】【POI2005】Kos-Dicing

    网络流/二分法 最大值最小……直接做不太好做的时候就可以用二分+判定来搞. 这题我们就也可以二分最大胜场v,那么怎么来判定呢?首先我们发现:每场比赛要么A赢,要么B赢,这一点跟二分图匹配非常类似,那么 ...

  4. Bzoj 1532: [POI2005]Kos-Dicing 二分,网络流

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1373  Solved: 444[Submit][St ...

  5. BZOJ1533: [POI2005]Lot-A Journey to Mars

    1533: [POI2005]Lot-A Journey to Mars Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 174  Solved: 76[S ...

  6. BZOJ1528: [POI2005]sam-Toy Cars

    1528: [POI2005]sam-Toy Cars Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 282  Solved: 129[Submit][S ...

  7. BZOJ1537: [POI2005]Aut- The Bus

    1537: [POI2005]Aut- The Bus Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 158  Solved: 100[Submit][S ...

  8. BZOJ1532: [POI2005]Kos-Dicing

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1060  Solved: 321[Submit][St ...

  9. BZOJ 1537: [POI2005]Aut- The Bus(dp + BIT)

    对y坐标离散化, 然后按x坐标排序, dp. 一个点(x, y), 设到达这个点接到的最多乘客数为t, 那么t可以用来更新y'>=y的所有点.用树状数组维护最大值. -------------- ...

随机推荐

  1. 无中间变量交换swap(a,b)

    #include <stdio.h> /* 加减法 整型.浮点型(损失精度) */ void swap1(int *a,int *b) { *a=*a+*b; *b=*a-*b; *a=* ...

  2. getchar()(转)

    出处:http://www.cnblogs.com/jiangjun/archive/2012/05/16/2503676.html 1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf( ...

  3. JavaScript对象创建,继承

    创建对象 在JS中创建对象有很多方式,第一种: var obj = new Object(); 第二种方式: var obj1 = {};//对象直面量 第三种方式:工厂模式 function Per ...

  4. 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整

    学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...

  5. python re模块search()与match()区别

    re.search()搜索字符串并返回结果. 整个字符串搜索. re.match()匹配字符串并返回结果 从开始处匹配. 所以,match()可以理解为search()的一个子集.

  6. Windows 10(64位)配置Caffe运行环境的基本流程

    最新博客地址已搬家到: http://blog.csdn.net/zzlyw/article/details/53215148

  7. eclipse软件创建servlet

    网上找了好多资料,eclipse创建servlet后,发到tomcat下发布,不能编译,生产class文件. 很多回答的都是一知半解,太气人了,看书.把资料找了一天,才发现是没有servlet-api ...

  8. maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository. ...

  9. 2015 史考特(Scottrade)开户指南 + 招商银行香港一卡通汇款【图文教程】

    最近刚开始炒美股.总的来说分为两步:一是开户,即选一个美股券商开设股票交易账户:二是汇款注资,把人民币换成美元转账到股票交易账户上.上述第一点其实相对简单,美股券商大多都对美国以外的外国人开放申请,且 ...

  10. hdu 2222 Keywords Search

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路:裸AC自动机,直接贴代码做模板 #include<stdio.h> #includ ...