博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】树链剖分求LCA
阅读量:4988 次
发布时间:2019-06-12

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

洛谷3379

1 #include
2 #include
3 using namespace std; 4 const int maxn=500010,inf=1e9; 5 int n,m,x,y,root,tot,dep[maxn],son[maxn],size[maxn],fa[maxn],top[maxn],last[maxn]; 6 struct edge{
int to,pre;}e[maxn<<1]; 7 inline void read(int &k){ 8 k=0; int f=1; char c=getchar(); 9 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();10 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();11 k*=f;12 }13 void add(int x,int y){e[++tot].to=y; e[tot].pre=last[x]; last[x]=tot;}14 void dfs1(int x){15 size[x]=1; dep[x]=dep[fa[x]]+1;16 for (int i=last[x],to;i;i=e[i].pre)17 if ((to=e[i].to)!=fa[x]){18 fa[to]=x; dfs1(to);19 size[x]+=size[to];20 if (size[to]>size[son[x]]) son[x]=to;21 }22 }23 void dfs2(int x,int tp){24 top[x]=tp;25 if (son[x]) dfs2(son[x],tp);26 for (int i=last[x],to;i;i=e[i].pre)27 if ((to=e[i].to)!=fa[x]&&to!=son[x]) dfs2(to,to);28 }29 int lca(int x,int y){30 int f1=top[x],f2=top[y];31 while(f1!=f2){32 if (dep[f1]
View Code

转载于:https://www.cnblogs.com/DriverLao/p/7794810.html

你可能感兴趣的文章
【SHOI2015】脑洞治疗仪(恶心的线段树,区间最大子段和)
查看>>
Educational Codeforces Round 17
查看>>
源码安装pipelineDB之CentOS7
查看>>
剑指Offer 斐波那契数列
查看>>
C#: string与byte[]互转
查看>>
hdu 5381 The sum of gcd
查看>>
控制台修改Mysql 密码
查看>>
C 【block类型全方位详解】
查看>>
蚂蚁拼图
查看>>
java是传值还是传引用
查看>>
angularJS快速入门
查看>>
markdown基本语法
查看>>
【译】为什么估算很难?!从旧金山到洛杉矶的旅行
查看>>
半年没玩机会碰到驱动了,最近才有机会研究了下所谓防黑墙demo
查看>>
我记录开源系统1.6源码解析(一)
查看>>
256. Paint House房屋染色
查看>>
671. Second Minimum Node In a Binary Tree 非递减二叉树中第二小的元素
查看>>
747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
查看>>
105. Construct Binary Tree from Preorder and Inorder Traversal根据前中序数组恢复出原来的树...
查看>>
MS-SQL Server [摘改]
查看>>