TM我重新打的板子,然而。。。。。。
5分钟打完 debug两小时
我的写法常数太大了
每次DFS都要For去更新F
最后写了快读才A
改:
只处理f[i][0]
dfs结束在处理f
整整快了一倍多!!!!!!!!
靠!!
烦。。。。
#include<cstdio> #include<iostream> using namespace std; #define olinr return #define love_nmr 0 #define nmr 505050 struct node { int nxt,to; }edge[nmr<<1]; int head[nmr]; int n; int m; int root; int f[nmr][35]; int dep[nmr]; int cnt; inline int read() { char ch=getchar(); int x=0,f=1; while(!isdigit(ch)) { if(ch=='-') f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { putchar('-'); x=-x; } if(x>9) put(x/10); putchar(x%10+'0'); } inline void add(int from,int to) { cnt++; edge[cnt].to=to; edge[cnt].nxt=head[from]; head[from]=cnt; } inline void dfs(int x,int fa) { dep[x]=dep[fa]+1; f[x][0]=fa; for(int i=head[x];i;i=edge[i].nxt) { int go=edge[i].to; if(go!=fa) dfs(go,x); } } inline void swap(int &x,int &y) { int t=x; x=y; y=t; } inline int LCA(int x,int y) { if(dep[x]<dep[y]) swap(x,y); for(int i=30;i>=0;i--) if(dep[x]-(1<<i)>=dep[y]) x=f[x][i]; if(x==y) olinr x; for(int i=30;i>=0;i--) if(f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } olinr f[x][0]; } int main() { n=read(); m=read(); root=read(); int x,y; for(int i=1;i<=n-1;i++) { x=read(); y=read(); add(x,y); add(y,x); } dfs(root,0); for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; for(int i=1;i<=m;i++) { x=read(); y=read(); put(LCA(x,y)); putchar('\n'); } olinr love_nmr; }