LCA ST

ST算法:

预处理每个节点的深度

预处理pow[i]=2^i;

算法是分两步的
1.x,y走到同一深度。
2.x,y要走到同一个点。

预处理一个f数组
f[i][j]表示i点向上走2^j步到达的点是谁

for (int i=1;i<=n;i++)
    f[i][0]=pa[i];
for (int j=1;j<=20;j++)
   for (int i=1;i<=n;i++)
       f[i][j]=f[f[i][j-1]][j-1];


i 向上走 2^j 步
i 走 2^(j-1) 再走 2^(j-1)
 f[i][j-1]

for (int k=20;k>=0;k--)
{
      xx=f[x][k]; yy=f[y][k];
      //if (xx==yy)
      if (xx!=yy)
      {
           x=xx;
           y=yy;
       }
} 
pa[x]=pa[y]=LCA(x, y)


if  (dep[x]<dep[y]) 
     swap(x, y)
c=dep[x]-dep[y]; //c就是深度差

for (int k=20;k>=0;k--)
{
    if (c>pow[k])
    {
         x=f[x][k];
         c-=pow[k];
     }
}

dep: n
f : nlogn
pow: logn

nlogn

q*logn

O(nlogn + qlogn)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值