int time1;
int timepoint[N],repoint[N],deep[N]; //N为n*2
int dp[N][20];
void getdeep(int pos,int pre,int deeptemp)
{
++time1;
timepoint[pos]=time1;
repoint[time1]=pos;
deep[time1]=deeptemp;
for(int p=head[pos];p!=-1;p=edge[p].next)
{
if(edge[p].to!=pre)
{
getdeep(edge[p].to,pos,deeptemp+1);
++time1;
repoint[time1]=pos;
deep[time1]=deeptemp;
}
}
}
int getlog(int x)
{
int ret=0;
x>>=1;
while(x)
{
++ret;
x>>=1;
}
return ret;
}
void getdp(int n)
{
n>>=1;
int k=getlog(n);
FOR(i,1,n) dp[i][0]=i;
FOR(j,1,k)
FOR(i,1,n)
if(i+(1<<j)<=n)
{
if( deep[ dp[i][j-1] ]<deep[ dp[i+(1<<(j-1))][j-1] ] ) dp[i][j]=dp[i][j-1];
else dp[i][j]=dp[i+(1<<(j-1))][j-1];
}
}
int getlca(int x,int y)
{
x=timepoint[x],y=timepoint[y];
if(x>y) swap(x,y);
int k=getlog(y-x+1);
int ret;
if(deep[ dp[x][k] ] < deep[ dp[y-(1<<k)+1][k] ] ) ret=dp[x][k];
else ret=dp[y-(1<<k)+1][k];
return repoint[ret]; //返回lca
//return deep[time1]; //返回lca深度
}
void solve(int n)
{
time1=0;
getdeep(1,-1,1);
getdp(n);
}
LCA+RMQ
最新推荐文章于 2020-04-03 23:25:44 发布