(RMQ版)LCA注意要点

1 inline int lca(int x,int y){    if(x>y)    swap(x,y);
2     return (h[rmq[log[y-x+1]][x]]<h[rmq[log[y-x+1]][y-near[y-x+1]+1]])?
3     rmq[log[y-x+1]][x]:rmq[log[y-x+1]][y-near[y-x+1]+1];}

查询代码如上

1     build(1,0);
2     for(int i=1;i<=N;i++)
3         rmq[0][i]=list[i];
4     for(int i=1,j=0,k=1;i<=N;log[i]=j,near[i]=k,i++)
5         if(i>k*2)    j++,k*=2;
6     for(int i=1,k=2;k<=N;i++,k*=2)
7         for(int j=1;j<=N-k+1;j++)
8             rmq[i][j]=(h[rmq[i-1][j]]<h[rmq[i-1][j+k/2]])?rmq[i-1][j]:rmq[i-1][j+k/2];

初始化代码如上

(懒得贴build了,而且各题目有所不同)

在build中,每次到一个点的时候记录一下,每找完一个儿子再记录一次


容易写错的点(也就我这种蒟蒻才会写错这么简单的东西吧)

1.找的时候找的是pos,不要用原数

2.初始化的时候k永远大于等于i/2小于i

3.比较的是h,返回的是rmq(这个不是很容易错)

一定要分清原数和dfs序的关系

都是细节,每次都在调这种东西

原文地址:https://www.cnblogs.com/wanglichao/p/5751908.html