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序的关系
都是细节,每次都在调这种东西