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

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

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

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

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=25010;
  6. const double eps=1e-10;
  7. int T,l,i,j,k,nxt[N];
  8. inline int sgn(double x){
  9. if(x<-eps)return -1;
  10. if(x>eps)return 1;
  11. return 0;
  12. }
  13. struct P{
  14. double x,y,o;
  15. P(){}
  16. P(double _x,double _y){x=_x,y=_y;}
  17. P operator+(const P&b){return P(x+b.x,y+b.y);}
  18. P operator-(const P&b){return P(x-b.x,y-b.y);}
  19. P operator/(double b){return P(x/b,y/b);}
  20. bool operator==(const P&b){return !sgn(x-b.x)&&!sgn(y-b.y);}
  21. bool operator!=(const P&b){return sgn(x-b.x)||sgn(y-b.y);}
  22. void cal(){o=atan2(y,x);}
  23. double operator*(const P&b){return x*b.x+y*b.y;}
  24. double len(){return sqrt(x*x+y*y);}
  25. double lensqr()const{return x*x+y*y;}
  26. }a[N],b[N],O;
  27. inline bool cmp(const P&a,const P&b){
  28. if(!sgn(a.o-b.o))return a.lensqr()>b.lensqr();
  29. return a.o<b.o;
  30. }
  31. struct Set{
  32. int n,m;P f[N];
  33. void init0(){
  34. n=l;
  35. for(i=0;i<n;i++)a[i]=b[i];
  36. }
  37. void init1(){
  38. n=l;
  39. for(i=0;i<n;i++)a[i]=b[i],a[i].x*=-1;
  40. }
  41. void init(){
  42. O=P(0,0);
  43. for(i=0;i<n;i++)O=O+a[i];
  44. O=O/((double)n);
  45. for(i=j=m=0;i<n;i++)if(a[i]==O)m++;else a[j++]=a[i];
  46. n=j;
  47. for(i=0;i<n;i++)a[i]=a[i]-O,a[i].cal();
  48. if(!n)return;
  49. sort(a,a+n,cmp);
  50. a[n]=a[0];
  51. 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());
  52. for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){
  53. while(~j&&f[j+1]!=f[i])j=nxt[j];
  54. if(f[j+1]==f[i])j++;
  55. }
  56. }
  57. }A,B;
  58. void init(){
  59. scanf("%d",&l);
  60. for(i=0;i<l;i++)scanf("%lf%lf",&b[i].x,&b[i].y);
  61. }
  62. bool check(){
  63. if(A.n!=B.n||A.m!=B.m)return 0;
  64. if(!A.n)return 1;
  65. for(j=-1,k=0;k<2;k++)for(i=0;i<A.n;i++){
  66. while(~j&&B.f[j+1]!=A.f[i])j=nxt[j];
  67. if(B.f[j+1]==A.f[i]){
  68. j++;
  69. if(j==A.n-1)return 1;
  70. }
  71. }
  72. return 0;
  73. }
  74. int main(){
  75. init();
  76. A.init0();
  77. A.init();
  78. scanf("%d",&T);
  79. while(T--){
  80. init();
  81. B.init0();
  82. B.init();
  83. if(check()){puts("TAK");continue;}
  84. B.init1();
  85. B.init();
  86. puts(check()?"TAK":"NIE");
  87. }
  88. return 0;
  89. }

  

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. iOS警告收录及科学快速的消除方法

    来自: http://www.cnblogs.com/dsxniubility/p/4757760.html iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警 ...

  2. PHP cURL 使用cookie 模拟登录

    cURL是什么 cURL: http://php.net/manual/zh/book.curl.php PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务 ...

  3. 2. 上传Android代码到github

    1. 建立git仓库     cd到本地项目根目录,执行git命令     git init          同时会在项目根目录下生成一个.git的隐藏文件          windows下先禁用 ...

  4. 使用ngrok将内网映射为外网

    如何将自己的本地服务器映射到外网上去?我们可以使用ngrok这个工具,下载地址:http://pan.baidu.com/s/1slnMwPn 具体的操作步骤如下: 第一步.下载客户端我们建议下载的时 ...

  5. iOS web remote debug 正确的姿势

    在使用iOS Remote debug需要做以下准备 1. iOS devices 开启java script and web inspector 开启方式如下: 2. mac OS 自带的Safar ...

  6. CDR VBA将字母改为大写

    ActiveShape.Text.FontProperties.Uppercase = cdrSmallCapsFontCase

  7. Python3实现火车票查询工具

    Python 实现火车票查询工具 一. 实验介绍 通过python3实现一个简单的命令行版本的火车票查询工具,用实际中的例子会更感兴趣,不管怎么样,既练习了又可以自己使用. 1.  知识点: Pyth ...

  8. width:100%;与width:auto;的区别

    <div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...

  9. Sqlserver 2008清除数据库日志

    USE [master] GO ALTER DATABASE DBNAME SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE DBNAME SET ...

  10. 忘记Windows7登陆密码解决办法

    忘记 Windows7 的登陆密码,解决这个问题的思路就是替换 system32 下的 Magnify.exe . 可以从 WindowsPE 启动,到 C:\windows\system32 下. ...