TLE的代码:
#include<bits/stdc++.h>
#define add(x,y) eu[++l]=el[x],ev[l]=y,el[x]=l
using namespace std;
const int N=2000005;
struct edge{
int u,v,w;
}e[N];
int a[N],fa[N],f[20][N],d[N],t[N],s[N],el[N],eu[N],ev[N];
int n,m,x,y,z,c,ct,q,ki,la,ans,l;
#define gc ZZ==zz&&(zz=(ZZ=buf)+fread(buf,1,2000005,stdin),ZZ==zz)?EOF:*ZZ++
static char buf[2000005],*ZZ=buf,*zz=buf;
inline int read()
{
int x(0);char ch(gc);
while(ch<'0'||ch>'9')ch=gc;
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=gc;
return x;
}
bool cmp(edge x,edge y){return x.w>y.w;}
bool cmp1(int x,int y){return s[x]<s[y];}
int find(int x){return fa[x]?fa[x]=find(fa[x]):x;}
void dfs(int u,int dep){
for(int i=1;i<=19;++i)f[i][u]=f[i-1][f[i-1][u]];
d[u]=dep,s[u]=++ct;
for(int i=el[u];i;i=eu[i])
if(!d[ev[i]])
f[0][ev[i]]=u,dfs(ev[i],dep+1);
}
int lca(int u,int v){
if(d[u]>d[v])swap(u,v);
int tmp=d[v]-d[u];
for(int i=19;i>=0;--i)
if(tmp>=(1<<i))v=f[i][v],tmp-=(1<<i);
if(u==v)return t[u];
for(int i=19;i>=0;--i)
if(f[i][u]!=f[i][v])
u=f[i][u],v=f[i][v];
return t[f[0][v]];
}
signed main()
{
n=read(),m=read(),q=read();c=n;
for(int i=1;i<=m;++i){
x=read(),y=read(),z=read();
e[i].v=x,e[i].u=y,e[i].w=z;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;++i){
int f1=find(e[i].u),f2=find(e[i].v);
if(f1!=f2){
t[++c]=e[i].w,fa[f1]=fa[f2]=c;
add(c,f1),add(c,f2);
}
}
for(dfs(c,1);q--;){
ki=read();
for(int i=1;i<=ki;++i)
a[i]=read(),a[i]^=la;
sort(a+1,a+ki+1,cmp1);
ans=0;
for(int i=1;i<ki;++i){
ans=max(ans,lca(a[i],a[i+1]));
}
la=ans;
printf("%d\n",ans);
}
}
AC代码:
//一样
int f[N][20];
//一样
void dfs(int u,int dep){
for(int i=1;i<=19;++i)f[u][i]=f[f[u][i-1]][i-1];
//一样
for(int i=el[u];i;i=eu[i])
if(!d[ev[i]])
f[ev[i]][0]=u,dfs(ev[i],dep+1);
}
int lca(int u,int v){
//一样
for(int i=19;i>=0;--i)
if(tmp>=(1<<i))v=f[v][i],tmp-=(1<<i);
//一样
for(int i=19;i>=0;--i)
if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return t[f[v][0]];
}
signed main()
{
//一样
}