Description

  D博士对物理有着深入的研究,经典物理、天体物理、量子物理都有着以他的名字命名的定理。最近D博士着迷
于研究粒子运动的无规则性。对圣经深信不疑的他相信,上帝创造的任何事物必然是有序的、有理可循的,而不是
无规则的、混沌的。 经过长时间的研究,D博士找到了很多出现相当频繁的轨迹片断,他把这些轨迹片断储存在一
个很大的数据库内。他需要你帮助他写一个程序,对于一个给出的粒子运动轨迹,统计数据库中每个轨迹片断的出
现的次数。 为清楚起见,我们定义一个粒子的轨迹为二维平面上的一个点列(P1, P2, … PN)。点列P的一个子
列[i, j]定义为P中一段连续的子序列(Pi, Pi+1, … Pj)。点列P的一个子列[u, v]被称为点列Q = (Q1, Q2 … 
Qv-u+1)在P中的一次出现,当且仅当Q经过有限次的平移、旋转、翻转、放缩之后得到Q’满足Q’k = Pu+k-1(k =
 1 … u – v + 1)。 对平面X-Y进行四种操作的解释平移 设平移向量为(dx, dy),则任意点(x,y)平移后的结果
为(x+dx, y+dy) 旋转 设旋转角为t,则任意点(x,y)旋转后的结果为 (x cos t – y sin t, x sin t + y cos t)
 翻转 任意点(x,y) 翻转后的结果为(x, -y) 放缩 设放缩比例为p (p ≠ 0),则任意点(x,y)放缩后的结果为(px,
 py)

Input

  第一行两个整数N、M,分别描述待处理的粒子运动轨迹的点列大小与数据库内的轨迹片断个数。接下来M行依
次给出每个轨迹片断。每行先是一个正整数K,表示该轨迹片断点列的长度。然后2K个整数,依次描述点列中的K个
点的横坐标与纵坐标。接下来一行2N个整数,依次描述待处理的粒子运动轨迹的点列中N个点的横坐标与纵坐标。
注:输入中的每条轨迹中任意相邻两点不会相同。

Output

  应包含M行,依次给出每个片段在待处理运动轨迹中的出现次数。

在平移旋转翻转变换后图形与原图相似,每条轨迹相邻三点构成一个有向三角形,可以用三边边长平方的最简整数比以及转向共4个数表示,但转向会因翻转而取反
将三个点及以上轨迹片段建出ac自动机,把点列及翻转后的点列分别在ac自动机上跑一次然后沿fail树统计答案
若轨迹片段上所有点共线则会被算两次要去重,若轨迹片段不足三个点可以直接算出出现次数
#include<bits/stdc++.h>
const int N=;
char buf[],*ptr=buf-;
int _(){
int x=,f=,c=*++ptr;
while(c<)c=='-'&&(f=-),c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
int gcd(int a,int b){
for(int c;b;c=a,a=b,b=c%b);
return a;
}
int dis(int x,int y){
return x*x+y*y;
}
int n,m,x[N],y[N],e[N],ans[N];
bool re[N];
struct tri{
int a,b,c,d;
tri(int w){
int x1=x[w]-x[w-],y1=y[w]-y[w-],x2=x[w]-x[w+],y2=y[w]-y[w+];
a=dis(x1,y1);
b=dis(x2,y2);
c=dis(x1-x2,y1-y2);
int g=gcd(a,gcd(b,c));
if(g>)a/=g,b/=g,c/=g;
d=x1*y2-x2*y1;
d=d<?-:d>;
}
bool operator<(tri w)const{
return a!=w.a?a<w.a:b!=w.b?b<w.b:c!=w.c?c<w.c:d<w.d;
}
};
std::map<tri,int>nx[N];
int p=,fa[N],deg[N],t[N],q[N],ql=,qr=;
int main(){
buf[fread(buf,,sizeof(buf),stdin)]=;
n=_();m=_();
for(int i=;i<m;++i){
int c=_();
for(int j=;j<c;++j){
x[j]=_();y[j]=_();
}
if(c<)ans[i]=n+-c,re[i]=;
else{
int w=;
for(int j=;j<c;++j){
tri t(j-);
if(t.d)re[i]=;
if(nx[w].find(t)==nx[w].end())nx[w][t]=++p;
w=nx[w][t];
}
e[i]=w;
}
}
ql=qr=;q[++qr]=;
while(ql!=qr){
int w=q[++ql];
for(std::map<tri,int>::iterator it=nx[w].begin();it!=nx[w].end();++it){
int u=it->second,v=fa[w];
q[++qr]=u;
while(v&&nx[v].find(it->first)==nx[v].end())v=fa[v];
fa[u]=v?nx[v][it->first]:;
}
}
for(int i=;i<n;++i){
x[i]=_();y[i]=_();
}
int w=;
for(int i=;i<n;++i){
tri t(i-);
while(w&&nx[w].find(t)==nx[w].end())w=fa[w];
w=w?nx[w][t]:;
++::t[w];
}
for(int i=;i<n;++i)y[i]=-y[i];
w=;
for(int i=;i<n;++i){
tri t(i-);
while(w&&nx[w].find(t)==nx[w].end())w=fa[w];
w=w?nx[w][t]:;
++::t[w];
}
ql=qr=;
for(int i=;i<=p;++i)++deg[fa[i]];
for(int i=;i<=p;++i)if(!deg[i])q[++qr]=i;
deg[]=0x3f3f3f3f;
while(ql!=qr){
int w=q[++ql],f=fa[w];
t[f]+=t[w];
if(!--deg[f])q[++qr]=f;
}
for(int i=;i<m;++i)if(e[i])ans[i]=t[e[i]];
for(int i=;i<m;++i)printf("%d\n",re[i]?ans[i]:ans[i]>>);
return ;
}

bzoj1039: [ZJOI2008]无序运动Movement的更多相关文章

  1. [ZJOI2008]无序运动Movement

    Description D博士对物理有着深入的研究,经典物理.天体物理.量子物理都有着以他的名字命名的定理.最近D博士着迷于研究粒子运动的无规则性.对圣经深信不疑的他相信,上帝创造的任何事物必然是有序 ...

  2. bzoj 1030-1039

    1030 JSOI2007 文本生成器 AC自动机加DP即可. 1031 JSOI2007 字符加密Cipher 后缀数组即可. 1032 JSOI2007 祖码Zuma 数据有问题. 设\(f(l, ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ练习记

    决定从头到尾干一波BZOJ!可能会写没几题就停下吧,但还是想学学新姿势啦. 1001. [BeiJing2006]狼抓兔子 即求 $(1, 1)$ 到 $(n, m)$ 的最小割.跑 dinic 即可 ...

  5. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  6. bzoj1036 [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 12646  Solved: 5085 [Subm ...

  7. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  8. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

    [BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...

  9. 【BZOJ】【1040】【ZJOI2008】骑士

    树形DP/基环树DP 我掉坑掉了好多…… 这题图比较特殊,每个连通块都是一棵基环树(我一开始以为图是连通的了……sigh,我说为什么网上的题解都要累加ans……),那么对于一棵基环树,我们先dfs找到 ...

随机推荐

  1. renderman、arnold及全局光照

    走马观花看了一些实现全局光(global illumination)的文章,都是非实时电影级的.的确可以分为两个阵营,一是pixar的renderman中常用的reyes+点云,感觉pixar一路走来 ...

  2. 【Python】使用正则表达式实现计算器练习

    已知有以下这样一个不太友好的公式: 1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 ...

  3. SqlServer性能优化分割提升性能分布式视图(七)

    分布式视图: 1.将大表分割到多个服务器上存储 2.物理上与逻辑上都存在多个表 3.通过视图实现对分布到多个服务器表进行访问 4.整合网络负载平衡 链接两台数据库: 建立同样的数据结构: create ...

  4. Caffe 源碼閱讀(四) Layer.hpp Layer.cpp

    1.Setup() Layer初始化参数 (1.完成层参数的读入.处理 2.设置底层顶层的shape,在前向传播前完成) InitMutex CheckBolbCounts: LayerSetup:d ...

  5. Dijksktra(测试源代码)

    1.此程序为c++程序 2.以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段 3.源代码 #include<iostream> using namespac ...

  6. centos 安装beanstalkd

    You need to have the EPEL repo (http://www.servermom.org/2-cents-tip-how-to-enable-epel-repo-on-cent ...

  7. java的覆盖重写隐藏和C#中的不同

    先看下C#中的: C#中覆盖 隐藏 重写这三种有不同的意义,而Java中不同. 1. java中没有new ,使用new会报错,编译不通过. 2. java中重写和覆盖应该是一个意思 static c ...

  8. RTSP协议媒体数据发包相关的细节

    最近完成了一RTSP代理网关,这是第二次开发做RTSP协议相关的开发工作了,相比11年的简单粗糙的版本,这次在底层TCP/IP通讯和RTSP协议上都有了一些新的积累,这里记录一下.基本的RTSP协议交 ...

  9. EF里一对一、一对多、多对多关系的配置

    EF关系规则 参考文章:http://www.cnblogs.com/feigao/p/4617442.html Entity Framework 实体间的关系,一对一,一对多,多对多,根据方向性来说 ...

  10. C(++) Websocket实现扫码二维码登录---GoEasy

    最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...