#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+1;
int n,m,root;
vector<int> to [maxn];
vector<int> pos;
bool vis[maxn];
int st[25][maxn];
int dfn[maxn], idx, D[maxn],B[maxn];
int dt[maxn];
int ln(int a)
{
return log(a)/log(2);
}
void dfs(int x)
{
D[x]=++idx;
B[idx]=x;
pos.push_back(D[x]);
vis[x]=1;
for(int i=0;i<to[x].size();i++)
if(!vis[to[x][i]])
{
dt[to[x][i]]=dt[x]+1;
dfs(to[x][i]);
pos.push_back(D[x]);
}
dfn[D[x]]=pos.size();
vis[x]=0;
}
int query(int a,int b)
{
if(a>b)
swap(a,b);
int k=ln(b-a+1);
return min(st[k][a],st[k][b-(1<<k)+1]);
}
signed main()
{
scanf("%d%d",&n,&m);
int a,b,c;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
if(i==1)
root=a;
to[a].push_back(b);
to[b].push_back(a);
}
dfs(root);
for(int i=1;i<=pos.size()+1;i++)
{
st[0][i]=pos[i-1];
}
for(int i=1;(1<<i)<=pos.size();i++)
{
for(int j=1;j+(1<<i)<=pos.size()+1;j++)
{
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
int P1=query(dfn[D[a]],dfn[D[b]]);
int P2=query(dfn[D[a]],dfn[D[c]]);
int P3=query(dfn[D[b]],dfn[D[c]]);
// cout<<D[a]<<" "<<D[b]<<" "<<D[c]<<endl<<endl;
// cout<<P1<<" "<<P2<<" "<<P3<<endl;
if(P1==P2&&P2==P3)
{
printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-3*dt[B[P1]]);
}
if(P1==P2&&P2!=P3)
{
printf("%d %d\n",B[P3],dt[a]+dt[b]+dt[c]-dt[B[P3]]-2*dt[B[P2]]);
}
if(P1==P3&&P2!=P3)
{
printf("%d %d\n",B[P2],dt[a]+dt[b]+dt[c]-dt[B[P2]]-2*dt[B[P1]]);
}
if(P2==P3&&P1!=P2)
{
printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-dt[B[P1]]-2*dt[B[P2]]);
}
}
return 0;
}
/*
18 5
8 9
9 10
9 11
1 8
7 1
2 1
2 3
2 4
4 5
5 6
2 12
2 13
12 14
12 15
12 16
18 15
17 15
*/
这是MLE,显示125MB https://www.luogu.com.cn/record/172424883
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500001;
int n,m,root;
vector<int> to [maxn];
vector<int> pos;
bool vis[maxn];
int st[25][maxn];
int dfn[maxn], idx, D[maxn],B[maxn];
int dt[maxn];
int ln(int a)
{
return log(a)/log(2);
}
void dfs(int x)
{
D[x]=++idx;
B[idx]=x;
pos.push_back(D[x]);
vis[x]=1;
for(int i=0;i<to[x].size();i++)
if(!vis[to[x][i]])
{
dt[to[x][i]]=dt[x]+1;
dfs(to[x][i]);
pos.push_back(D[x]);
}
dfn[D[x]]=pos.size();
vis[x]=0;
}
int query(int a,int b)
{
if(a>b)
swap(a,b);
int k=ln(b-a+1);
return min(st[k][a],st[k][b-(1<<k)+1]);
}
int main()
{
scanf("%d%d",&n,&m);
int a,b,c;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
if(i==1)
root=a;
to[a].push_back(b);
to[b].push_back(a);
}
dfs(root);
for(int i=1;i<=pos.size()+1;i++)
{
st[0][i]=pos[i-1];
}
for(int i=1;(1<<i)<=pos.size();i++)
{
for(int j=1;j+(1<<i)<=pos.size()+1;j++)
{
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
int P1=query(dfn[D[a]],dfn[D[b]]);
int P2=query(dfn[D[a]],dfn[D[c]]);
int P3=query(dfn[D[b]],dfn[D[c]]);
if(P1==P2&&P2==P3)
{
printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-3*dt[B[P1]]);
}
if(P1==P2&&P2!=P3)
{
printf("%d %d\n",B[P3],dt[a]+dt[b]+dt[c]-dt[B[P3]]-2*dt[B[P2]]);
}
if(P1==P3&&P2!=P3)
{
printf("%d %d\n",B[P2],dt[a]+dt[b]+dt[c]-dt[B[P2]]-2*dt[B[P1]]);
}
if(P2==P3&&P1!=P2)
{
printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-dt[B[P1]]-2*dt[B[P2]]);
}
}
return 0;
}
/*
18 5
8 9
9 10
9 11
1 8
7 1
2 1
2 3
2 4
4 5
5 6
2 12
2 13
12 14
12 15
12 16
18 15
17 15
*/
这是WA,WA的那两个点显示81.75MB和81.76MB
太奇怪了!怎么#define int long long 写了就导致空间爆掉,不写就炸int?