(RMQ版)LCA注意要点

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

查询代码如上

     build(,);
for(int i=;i<=N;i++)
rmq[][i]=list[i];
for(int i=,j=,k=;i<=N;log[i]=j,near[i]=k,i++)
if(i>k*) j++,k*=;
for(int i=,k=;k<=N;i++,k*=)
for(int j=;j<=N-k+;j++)
rmq[i][j]=(h[rmq[i-][j]]<h[rmq[i-][j+k/]])?rmq[i-][j]:rmq[i-][j+k/];

初始化代码如上

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

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


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

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

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

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

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

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

上一篇:项目启动报错:Communications link failure


下一篇:python 冒泡和快排,不多说