LCA rmq st model
LCA:倍增 memset(p,-1,sizeof(p)); inline void dfs(int u) { for (int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if (deep[v]==0) { deep[v]=deep[u]+1; p[v][0]=u; dfs(v); } } } void init() { for (int j=1;(1<<j)<=n;j++) for (int i=1;i<=n;i++) if (p[i][j-1]!=-1) p[i][j]=p[p[i][j-1]][j-1]; } //deep[1]的初始为1 int lca(int a,int b) { int i,j; if (deep[a]<deep[b]) swap(a,b); for (i=0;(1<<i)<=deep[a];i++); i--; for (j=i;j>=0;j--) if (deep[a]-(1<<j)>=deep[b]) a=p[a][j]; if (a==b) return a; for (j=i;j>=0;j--) { if (p[a][j]!=-1&&p[a][j]!=p[b][j]) { a=p[a][j]; b=p[b][j]; } } return p[a][0]; }
随性Code