[noip模拟]祖孙询问<LCA>
【问题描述】
已知一棵n个节点的有根树。有m个询问。每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系。
【输入格式】
输入第一行包括一个整数n表示节点个数。
接下来n行每行一对整数对a和b表示a和b之间有连边。如果b是-1,那么a就是树的根。
第n+2行是一个整数m表示询问个数。
接下来m行,每行两个正整数x和y。
【输出格式】
对于每一个询问,输出1:如果x是y的祖先,输出2:如果y是x的祖先,否则输出0。
【样例输入】
10
234 -1
12 234
13 234
14 234
15 234
16 234
17 234
18 234
19 234
233 19
5
234 233
233 12
233 13
233 15
233 19
【样例输出】
1
0
0
0
2
【数据规模】
对于30%的数据,n,m≤1000。
对于100%的.据,n,m≤40000,每个节点的编号都不超过40000。
这是去年我们考的一套题,现在回过头来看,其实不难啊,谁知道当年还做的要死要活的
这题就是一个裸的LCA,毕竟题目都这样说了
我用了tarjan,因为个人来说我的tarjan打的要差一些,但是打了这题后,我对tarjan求LCA的理解要正常的许多了
裸的tarjan,额外处理就是储存一个对每一个询问边的最近公共祖先,但是我们建立询问边是建立了两条,所以要注意在储存答案时要合并起来
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<queue>
#include<cmath>
#define maxn 40005
using namespace std; struct node{
int u,v,nxt;
}e[maxn*],p[maxn*]; int n,m,dfn[maxn],fa[maxn],belong[maxn],root,maxid;
int head[maxn],heap[maxn],vis[maxn*],visid[maxn];
int ord[maxn*]; int tot;
void adde(int u,int v){e[tot]=(node){u,v,head[u]};head[u]=tot++;} int tpt;
void addp(int u,int v,int pos){p[tpt]=(node){u,v,heap[u]};
ord[tpt]=pos;heap[u]=tpt++;
} int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);} int num;
void tarjan(int u,int from){
dfn[u]=++num;
for(int i=head[u];i!=-;i=e[i].nxt ){
int v=e[i].v;
if(!dfn[v]){tarjan(v,u);fa[v]=u;visid[v]=;}
}
for(int i=heap[u];i!=-;i=p[i].nxt){
int vv=p[i].v;
if(visid[vv]&&!vis[ord[i]]){vis[ord[i]]=find(vv);}
}
} int main(){
freopen("tarjanlca.txt","r",stdin);
memset(head,-,sizeof(head));
memset(heap,-,sizeof(heap));
scanf("%d",&n);
for(int i=;i<=n;i++){
int u,v;scanf("%d%d",&u,&v);
if(v==-){root=u;continue;}
adde(u,v);adde(v,u);maxid=max(maxid,max(u,v));
}
for(int i=;i<=maxid;i++)fa[i]=i;
scanf("%d",&m);
for(int i=;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
addp(u,v,i);addp(v,u,i);
}visid[root]=;
tarjan(root,);
for(int i=;i<=m;i++){
int lca=vis[i],pos=(i-)*;
if(lca==p[pos].u ) puts("");
else if(lca==p[pos].v )puts("");
else puts("");
}
}
【总结】
tarjan大法好,可惜皮不来啊
[noip模拟]祖孙询问<LCA>的更多相关文章
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- hzwer 模拟题 祖孙询问
祖孙询问 题目描述 已知一棵n个节点的有根树.有m个询问.每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系. 输入输出格式 输入格式: 输入第一行包括一个整数n表示节点个数. 接下来n行每行一 ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- NOIP模拟赛-2018.11.6
NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...
- NOIP模拟 17.8.20
NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- 2018.9.22 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
随机推荐
- qt creator源码全方面分析(3-2)
目录 qtcreator.pri 判断重复包含 定义版本信息 VERSION 定义IDE名称 启用C++14 CONFIG 自定义函数 Replace Functions Test Functions ...
- 单页面和多页面的网页差别比较(SPA)
单页面应用(singlePAge Web Application) 多页面应用MultiPage Applicaton,MPA) 组成 一个外壳页面和多个页面片段组成 多个完整的页面组成 资源公用 ...
- 基于FPGA的三段式状态机
状态机分类: 通常, 状态机的状态数量有限, 称为有限状态机(FSM) .由于状态机所有触发器的时钟由同一脉冲边沿触发, 故也称之为同步状态机. 根据状态机的输出信号是否与电路的输入有关分为 Meal ...
- 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 SpringBoot是如何实现自动配置的?--SpringBoot源码(四) 温故而知新,我们来简单回顾一下上 ...
- 关于PHP命名空间的讨论
什么是命名空间? 根据php.net官方翻译文档描述,命名空间是这样定义的: 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法. 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用 ...
- 解决 unable to lock the administration directory (/var/lib/dpkg/) 问题
阿里开源镜像站提供了raspbian的软件包镜像,国内的用户可以选择改用阿里镜像站作为更新源. 但是在更换源之后,执行 sudo apt-get update && apt-get u ...
- go-admin基于Gin + Vue + Element UI的前后端分离权限管理系统
✨ 特性 遵循 RESTful API 设计规范 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证.跨域.访问日志.追踪ID等) 基于Casbin的 RBAC 访问控制模型 JWT ...
- iview mock main.js
main.js // 实际打包时应该不引入mock /* eslint-disable */ // if (process.env.NODE_ENV !== 'production') require ...
- css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发外层hover,要用外层position 定义绝对定位,内层的hover跳出外层的div,这样视觉上就是两个单独的div,进行内外层联动。
css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发 ...
- Flutter配置环境报错“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”
背景:最近看了很多Flutter漂亮的项目,想要尝试一下.所有环境都搭建好之后,按照文档一步一步配置(抄袭),但始终报如下图错误. PKIX path building failed: sun.sec ...