COJ 1079 树上的查询 (离线LCA)
题意:给一棵含n个结点的树,现要查询从a到b的路径中是否包含c,共q次查询。1=<n,q<=100000
分析:由于在树中从一个结点走到另一个结点的路径是唯一的,其实说的这条路径就是最短路径,然后问题转化为判断一个点是否为在一条最短路径上,此时就不难想到这个这个判断条件d(a,c)+d(c,b)=d(a,b),问题就转化为查询树中2个结点之间的距离,这个可以用LCA来做(参考上一篇),考虑到n和q都比较大,所以用离线LCA.
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <stdio.h> #include <string.h> #define N 100010 #define M 200010 int n,q,e,eq; int p[N],d[N]; int first[N],next[M],v[M]; int first_q[N],next_q[3*M],u_q[3*M],v_q[3*M],lca[3*M]; bool ok[3*M]; void make_set(int i) {p[i]=i; } int find_set(int i) {if(i^p[i]) p[i]=find_set(p[i]);return p[i]; } void union_set(int i,int j) {i=find_set(i),j=find_set(j);p[j]=i; } void init() {e=eq=0;memset(first,-1,sizeof(first));memset(first_q,-1,sizeof(first_q));memset(p,-1,sizeof(p));memset(ok,0,sizeof(ok));memset(lca,0,sizeof(lca)); } void add(int a,int b) {v[e]=b;next[e]=first[a];first[a]=e++; } void add_q(int a,int b) {u_q[eq]=a;v_q[eq]=b;next_q[eq]=first_q[a];first_q[a]=eq++; } void get_d(int a,int fa) {int i,b;d[a]=d[fa]+1;for(i=first[a];i!=-1;i=next[i]){b=v[i];if(b!=fa) get_d(b,a);} } void dfs(int a) {int i,b;make_set(a);for(i=first[a];i!=-1;i=next[i]){b=v[i];if(p[b]==-1){dfs(b);union_set(a,b);}}for(i=first_q[a];i!=-1;i=next_q[i]) if(!ok[i]){b=v_q[i];if(p[b]!=-1) lca[i]=find_set(b),ok[i]=true;} } int main() {int a,b,c;while(~scanf("%d%d",&n,&q)){init();for(int i=0;i<n-1;i++){scanf("%d%d",&a,&b);add(a,b);add(b,a);}while(q--){scanf("%d%d%d",&a,&b,&c);add_q(a,b);add_q(a,c);add_q(b,c);add_q(b,a);add_q(c,a);add_q(c,b);}d[0]=-1;get_d(1,0);dfs(1);int dist[3];for(int i=0;i<eq;i+=6){for(int j=0;j<3;j++){a=u_q[i+j];b=v_q[i+j];c=lca[i+j];if(c==0) c=lca[i+j+3];dist[j]=d[a]+d[b]-2*d[c];}if(dist[0]==dist[1]+dist[2]) puts("YES");else puts("NO");}puts("");}return 0; }
转载于:https://www.cnblogs.com/algorithms/archive/2012/08/03/2622409.html
COJ 1079 树上的查询 (离线LCA)相关推荐
- [蓝桥杯][2018年第九届真题]版本分支(离线LCA模板)
题目描述 小明负责维护公司一个奇怪的项目.这个项目的代码一直在不断分支(branch)但是从未发生过合并(merge). 现在这个项目的代码一共有N个版本,编号1~N,其中1号版本是最初的版本. 除了 ...
- 51nod 2621 树上距离 (倍增+ LCA 模板)
51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...
- 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting
题目链接 题目大意: 就是给你nnn个数,mmm次询问 每次询问给你l,r,a,bl,r,a,bl,r,a,b问你在[l,r][l,r][l,r]区间里面有多少种种种数c(XOR)a≤bc(XOR)a ...
- Hibernate的事务级别控制与查询对象的API(Query查询与Criterial查询+离线查询)
1.事务级别控制 可以在Hibernate的配置文件中对事务进行配置.配置文件中,可以设置事务的隔离级别.其具体的配置方法是在hibernate.cfg.xml文件中的<session-fact ...
- F - Colorful Tree(LCA,树上差分,离线处理)
F - Colorful Tree 给定一棵树,边有边权,且每条边有一个颜色,有mmm次操作, 每次给定x,y,u,vx, y, u, vx,y,u,v,如果把颜色为xxx的边,边权修改为yyy,求u ...
- 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)
题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...
- sdcv: 在Ubuntu中使用命令行查询离线英文词典
在Ubuntu中,通过**sdcv**可以在命令行终端环境中查询英文单词,词库以离线形式存在.**sdcv**是词典**StartDcit**的命令行终端版本. ### Installation 通过 ...
- 邮编查询/区号查询/证件查询 离线版/单机版
受朋友之托,写了一个方便查询邮编的软件,在搜索框中直接粘贴输入完整地址,不用一个一个的去下拉框中选择, 便可跳出完整信息,闲来无事,顺便完善了一下,整个软件只有一个exe文件,完全精简化了,之前是存在 ...
- COJ 1006 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=979 WZJ的数据结构(六) 难度级别:D: 运行时间限制:1000ms: ...
- ST函数(ST表)RMQ O(1)查询 离线
ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...
最新文章
- mysql+怎样查询最后几条_mysql 查询开头或最后几行
- 微信小程序——收起和查看更多功能
- 在python中构造时间戳参数的方法
- javascript / DOM、BOM、document、window 区别和联系
- Atitit.异步的实现模式attilax大总结
- 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
- 函数式编程 模式_函数式编程模式:食谱
- 【安全】CDH集群开启Kerberos安全认证
- 湘潭大学 计算机学院程诗婕,云南大学学生获得2019CCF大学生计算机系统与程序设计竞赛西...
- python main调试_在main.py中调试显示这个是什么问题
- 内网分享文件html源码,vue项目分享html页面(服务器只能内网访问)
- 词法分析器java语言_Java语言词法分析器
- 一张图带你了解游戏程序员的学习之路
- Log4j2 CVE-2021-45046 鸡肋RCE漏洞复现与浅析
- 语音专题第三讲,语言模型
- unix_timestamp、from_unixtime时间戳函数的使用
- 阮一峰 / ES6 数组的解构赋值
- 九度OJ-1163:素数(未关联)
- 初中物理公式总结大全(pdf可下载)
- 【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)