链接
m<2000
建虚树后暴力
维护虚树中两点间的实际点的个数 模拟即可
巨丑的代码
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
#define yes puts("YES")
#define no puts("NO")
#define err puts("-1")
#define ios ios::sync_with_stdio(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int maxn = 5e5 + 6;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
LL qp(LL x,LL y)
{
LL ans=1;
x%=mod;
while(y)
{
if(y&1)
ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
LL inv(LL x)
{
return qp(x,mod-2);
}
//head
int lgN,n,m,op[maxn],dfn[maxn],b[maxn],u[maxn],v[maxn],k[maxn],dep[maxn],tot;
int fa[maxn][30];
VI G[maxn],fake[maxn];
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
fa[u][0]=f;
dfn[u]=++tot;
for(int i=1; i<=lgN; i++)
{
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int v:G[u])
if(v!=f)
{
dfs(v,u);
}
}
int anc[maxn],dp[maxn];
void dfs1(int u,int f)
{
anc[u]=f;
dp[u]=dp[f]+1;
for(int v:fake[u])
{
dfs1(v,u);
}