倍增TLE 2,9,10求助!!

P3379 【模板】最近公共祖先(LCA)

不介意的话您可以参考一下我的代码: ``` #include<bits/stdc++.h> #define MAXN 500015 #define MAXM MAXN-1 using namespace std; int n,m,s,max0; int tot,head[MAXN<<1],dep[MAXN<<1]; int fa[MAXN<<1][40]; struct node{ int u,v; int next; }edge[MAXM<<1]; void addedge(int x,int y) { edge[++tot].u=x; edge[tot].v=y; edge[tot].next=head[x]; head[x]=tot; } void dfs(int x) { for(int i=1;i<=max0;i++) if(fa[x][i-1]) fa[x][i]=fa[fa[x][i-1]][i-1]; else break; for(int i=head[x];i;i=edge[i].next) { int y=edge[i].v; if(y!=fa[x][0]){ fa[y][0]=x; dep[y]=dep[x]+1; dfs(y); } } } int LCA(int u,int v) { if(dep[u]<dep[v])swap(u,v); int delta=dep[u]-dep[v]; for(int x=0;x<=max0;x++) if((1<<x)&delta)u=fa[u][x]; if(u==v)return u; for(int x=max0;x>=0;x--) if(fa[u][x]!=fa[v][x]) { u=fa[u][x]; v=fa[v][x]; } return fa[u][0]; } int main() { scanf("%d%d%d",&n,&m,&s); max0=(int)(log(n)/log(2))+5; int x,y; for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x); } dfs(s); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); printf("%d\n",LCA(a,b)); } return 0; } ```
by xiangling @ 2018-07-20 10:14:28


大佬,你能告诉我我哪里错了么??
by zhou_yk @ 2018-07-23 14:48:16


@[rainman](/space/show?uid=55804) 我稍微改了一下,但还是错的,还是70分,但1个TLE,两个Wa! #1 AC 0ms/2445KB #2 TLE #3 AC 0ms/2304KB #4 AC 0ms/2238KB #5 AC 12ms/3421KB #6 AC 8ms/3429KB #7 AC 12ms/3507KB #8 AC 12ms/3351KB #9 WA #10 WA ```cpp #include <bits/stdc++.h> using namespace std; int n,m,size,s,x,y,u,v,tot,maxo,j; int next[1000005],head[1000005],fa[1000005],d[1000005],f[1000005][21],vet[1000005]; bool vis[1000005]; void add(int u,int v) { size++; next[size]=head[u]; head[u]=size; vet[size]=v; } void dfs(int root,int depth) { d[root]=depth;vis[root]=1; for (int i=head[root];i!=0;i=next[i]) { if (vis[vet[i]]!=0) continue; fa[vet[i]]=root; dfs(vet[i],depth+1); } } int lca(int u,int v) { if (d[u]<d[v]) swap(u,v); int de=d[u]-d[v]; for(int i=0;i<=maxo;i++) if ((1<<i)&de) u=f[u][i]; if (u==v) return u; for (int i=maxo;i>=0;i--) if (f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; return fa[u]; } int main() { scanf("%d%d%d",&n,&m,&s); maxo=(int)(log(n)/log(2))+5; for (int i=1;i<n;i++) { scanf("%d%d",&x,&y); add(x,y);add(y,x); } dfs(s,0); for(int i=1;i<=n;i++) f[i][0]=fa[i]; j=1; while (1<<j<=n) { for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; j++; } for (int i=1;i<=m;i++) { scanf("%d%d",&u,&v); printf("%d\n",lca(u,v)); } return 0; } ```
by zhou_yk @ 2018-07-23 15:17:45


|