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找到 ...
随机推荐
- [解决方案] pythonchallenge level 3
http://www.pythonchallenge.com/pc/def/equality.html 根据页面提示:一个小写字母刚刚好被左右3个大写字母包围. 查看页面代码得到需要处理的字符. 将字 ...
- 听课程C# Intermediate: Classes, Interfaces and OOP的笔记,持续修改更新ing
在第二章第7节中,我尝试并给我的Vistal Studio 2015加装了Resharper,感觉非常好用,现在就分享下我的一点心得. 首先为了防止Resharper的快捷键失灵,可以先重置所有的 V ...
- Yii框架(Yii Framework)部署
一.下载Yii 在部署yii框架之前首先要搭建好php环境,这里就不说搭建环境的问题了(这里已经部署好wampserver了),环境搭建好后,到yii官方网站下载yii framework:http: ...
- TeeChart常用编程语句汇总(C#)
我用的是C# 从网上看到资料拷贝过来备忘,共同学习下: 设置chart标题:axTChart1.Header.Text.Add("标题"); 修改标题:axTChart1.Hea ...
- POJ 2318
题目来源:http://poj.org/problem?id=2318 题目内容:给定一个矩形盒子(左上和右下端点的坐标),再给定n条线段,将盒子分为n+1份,之后给定m个点的坐标,对于盒子的每一段, ...
- Koala-Sass编译
1.安装: 下载地址:http://koala-app.com/ 安装好了之后,打开界面如下: 2.简单配置: 打开设置: 3.设置中文: 打开安装目录下的文件:C:\Program Files (x ...
- android 中theme和style的语法相关
1.theme和style都是一组属性的集合,用于定义文本.颜色.大小等显示风格.他们都是资源,可以用android系统级别的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源. 2.自定 ...
- jQuery HTML
alert("Text: " + $("#test").text());获取text alert("HTML: " + $("#t ...
- 关于ArcGis的二次开发-基于ArcEngine10.2(内有安装包)
网上很少有arcgis engine10.2的安装包,在这里我把安装包链接附上,是百度云,有需要的可以自己下--http://pan.baidu.com/s/1mhIhYYG 顺带着把arcgis d ...
- 通过全局getApp获取全局实例获取数据
学习是每一个人都要面对的铁一般的事实,不进则退.学习同样讲究途径和方法,面对知识这个巨人,我们永远不会有成年的那一刻,但我们可以让自己毕生尽可能地吸取更多有价值的信息,好让自己人生充满各种“意义”存在 ...