博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日模板一练——树链剖分求LCA(好吧是真的写错了)
阅读量:4978 次
发布时间:2019-06-12

本文共 1066 字,大约阅读时间需要 3 分钟。

大意

给一个N个节点的树和M个询问,对于每次询问输出两点的距离。

样例:

6

1 2
1 3
2 4
2 5
3 6
2
2 6
5 6

输出:

3

4

【代码~】

#include
using namespace std;const int MAXN=1e5+10;const int MAXM=3e5+10;int n,m,cnt;int head[MAXN],depth[MAXN],son[MAXN],siz[MAXN],father[MAXN];int top[MAXN];int nxt[MAXM],to[MAXM];int Read(){ int i=0,f=1; char c; for(c=getchar();(i>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0'; return i*f;}void Add(int x,int y){ cnt++; nxt[cnt]=head[x]; head[x]=cnt; to[cnt]=y;}void add(int x,int y){ Add(x,y); Add(y,x);}void dfs1(int u,int fa){ father[u]=fa; siz[u]=1,son[u]=0; for(int i=head[u];i!=-1;i=nxt[i]) { int v=to[i]; if(v!=fa) { depth[v]=depth[u]+1; dfs1(v,u); siz[u]+=siz[v]; if(siz[v]>siz[son[u]]) son[u]=v; } }}void dfs2(int u,int fa){ if(u==son[fa]) top[u]=top[fa]; else top[u]=u; for(int i=head[u];i!=-1;i=nxt[i]) { int v=to[i]; if(v!=fa) dfs2(v,u); }}int lca(int x,int y){ while(top[x]!=top[y]) { if(depth[top[x]]

 

转载于:https://www.cnblogs.com/Ishtar/p/10010807.html

你可能感兴趣的文章
python 迭代器与生成器
查看>>
[django]form的content-type(mime)
查看>>
仿面包旅行个人中心下拉顶部背景放大高斯模糊效果
查看>>
C# 小叙 Encoding (二)
查看>>
CSS自学笔记(14):CSS3动画效果
查看>>
项目应用1
查看>>
基本SCTP套接字编程常用函数
查看>>
C 编译程序步骤
查看>>
LeetCode N-Queens
查看>>
jstat 命令
查看>>
[Git] 005 初识 Git 与 GitHub 之分支
查看>>
【自定义异常】
查看>>
pip install 后 importError no module named "*"
查看>>
springmvc跳转方式
查看>>
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
MariaDB 和 MySQL 比较
查看>>
MYSQL: 1292 - Truncated incorrect DOUBLE value: '184B3C0A-C411-47F7-BE45-CE7C0818F420'
查看>>
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
查看>>
springMVC Controller 参数映射
查看>>