bzoj1039: [ZJOI2008]无序运动Movement
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行,依次给出每个片段在待处理运动轨迹中的出现次数。
#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的更多相关文章
- [ZJOI2008]无序运动Movement
Description D博士对物理有着深入的研究,经典物理.天体物理.量子物理都有着以他的名字命名的定理.最近D博士着迷于研究粒子运动的无规则性.对圣经深信不疑的他相信,上帝创造的任何事物必然是有序 ...
- bzoj 1030-1039
1030 JSOI2007 文本生成器 AC自动机加DP即可. 1031 JSOI2007 字符加密Cipher 后缀数组即可. 1032 JSOI2007 祖码Zuma 数据有问题. 设\(f(l, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ练习记
决定从头到尾干一波BZOJ!可能会写没几题就停下吧,但还是想学学新姿势啦. 1001. [BeiJing2006]狼抓兔子 即求 $(1, 1)$ 到 $(n, m)$ 的最小割.跑 dinic 即可 ...
- BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14302 Solved: 5779[Submit ...
- bzoj1036 [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12646 Solved: 5085 [Subm ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 14354 Solved: 5802 [Subm ...
- 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分
[BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...
- 【BZOJ】【1040】【ZJOI2008】骑士
树形DP/基环树DP 我掉坑掉了好多…… 这题图比较特殊,每个连通块都是一棵基环树(我一开始以为图是连通的了……sigh,我说为什么网上的题解都要累加ans……),那么对于一棵基环树,我们先dfs找到 ...
随机推荐
- header、footer、hgroup、address
header:整个页面或者一个块级区域的头部区域,通常用来放置标题等信息: footer:整个页面或者一个块级区域的底部区域,通常用来放置版权信息.联系方式等: hgroup:用来对属于一个块级区域的 ...
- centos单用户模式修改ROOT密码
首先启动的时候的时候,需要进入单用户模式(进入单用户模式的前提是系统引导器能正常工作),单用户模式是不需要输入密码,并且(进入单用户模式,没有开启网络服务,不支持远程连接 )网上说可以通过GRUB ( ...
- VS 2015 ,与Github的小问题笔记
2016.10.15 1:从Git.OSChina(Github)上,下载的项目代码 在配置完Remote Url后只能提取数据,却无法拉取原因. 原因:未采用Remote分支创建本地分支. 决解: ...
- (转)appendChild()、insertBefore()是移动element节点!
原文地址 appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"& ...
- C# foreach,等量代换,冒泡排序
foreach: foreach (int h in a) //可以将数组读出来(自动遍历数组) { Console.WriteLi ...
- 必须掌握的八个cmd 命令
一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它 所利用的原理是这样的:网络上的机器都有唯一确定的I ...
- 深入探讨在集群环境中使用 EhCache 缓存系统
EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用 ...
- Qt4编码
#if QT_VERSION < 0x050000 qDebug() << "qt5以下的版本, 从QTextCodec设置全局字符集"; QTextCodec* ...
- FMS 4中multicast脚本的小修正
FMS 4中multicast脚本的小修正 http://help.adobe.com/en_US/flashmediaserver/devguide/WS7812b00092aae0dc-2829d ...
- 深度|OpenAI 首批研究成果聚焦无监督学习,生成模型如何高效的理解世界(附论文)
本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载,原文. 选自 Open AI 作者:ANDREJ KARPATHY, PIETER ABBEEL, GREG BRO ...