求助 连样例都过不了
查看原帖
求助 连样例都过不了
1113009
xly915楼主2025/8/3 13:53
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5;
ll n,m,q,cnt,fa[N+5],dp[N+5][25],w[N+5][25],deep[N+5],lg[N+5];
bool vis[N+5];
struct node
{
	ll u,v,w;
}a[N*20+5];
struct tu
{
	ll v,w;
};
vector <tu> g[N+5];
bool cmp(node x,node y)
{
	return x.w<y.w;
}
ll get(ll x)
{
	if(fa[x]==x) return x;
	return fa[x]=get(fa[x]);
}
void dfs(ll u)
{
	vis[u]=1;
	for(ll i=0;i<g[u].size();i++)
	{
		ll v=g[u][i].v,ww=g[u][i].w;
		if(vis[v]) continue;
		deep[v]=deep[u]+1;
		dp[v][0]=u;
		w[v][0]=ww;	
		dfs(v);
	}
}
void ycl()
{
	for(ll j=1;j<=lg[n];j++)
	{
		for(ll i=1;i<=n;i++)
		{
			dp[i][j]=dp[dp[i][j-1]][j-1];
			w[i][j]=max(w[i][j-1],w[dp[i][j-1]][j-1]);
		}
	}
}
ll LCA(ll x,ll y)
{
	if(get(x)!=get(y)) return -1;
	if(deep[x]>deep[y]) swap(x,y);
	ll ans=0;
	for(ll i=lg[n];i>=0;i--)
	{
		if(deep[dp[y][i]]>=deep[x])
		{
			ans=max(ans,w[y][i]);
			y=dp[y][i];
		}
	}
	if(x==y) return ans;
	for(ll i=lg[n];i>=1;i--)
	{
		if(dp[x][i]!=dp[y][i])
		{
			ans=max(ans,max(w[x][i],w[y][i]));
			x=dp[x][i];
			y=dp[y][i];
		}
	}
	ans=max(ans,max(w[x][0],w[y][0]));
	return ans;
}
int main()
{
	cin>>n>>m;
	for(ll i=1;i<=n;i++) 
	{
		fa[i]=i;
		if(i>=2) lg[i]=lg[i>>1]+1;
	}
	for(ll i=1;i<=m;i++)
	{
		for(ll j=2;j*i<=n;j++)
		{
			cnt++;
			a[cnt].u=(j-1)*i;
			a[cnt].v=j*i;
			a[cnt].w=m-i+1;
		}
	}
	stable_sort(a+1,a+1+cnt,cmp);
	for(ll i=1;i<=cnt;i++)
	{
		ll rx=get(a[i].u),ry=get(a[i].v);
		if(rx==ry) continue;
		fa[ry]=rx;
		g[a[i].u].push_back({a[i].v,a[i].w});
		g[a[i].v].push_back({a[i].u,a[i].w});
	}
	for(ll i=1;i<=n;i++)
	{
		if(!vis[i]) 
		{
			deep[i]=1;
			dfs(i);
			w[i][0]=0;
			dp[i][0]=i;
		}
	}
	ycl();
	cin>>q;
	for(ll i=1;i<=q;i++)
	{
		ll x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<endl;
	}
	return 0;
}
2025/8/3 13:53
加载中...