TLE 3个点,3个点 WA 照着题解码的,求助

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

可能。。。是题解的反作弊??
by TomLovesRita @ 2019-05-17 17:34:44


@[名字好难起啊hh](/space/show?uid=67437) ??
by TomLovesRita @ 2019-05-17 17:34:58


@[名字好难起啊hh](/space/show?uid=67437) [自己](/space/show?uid=106235) @[自己](/space/show?uid=106235) 好评
by yu__xuan @ 2019-05-17 17:36:11


@[SAOKA_](/space/show?uid=25046) ``` lg[i] = lg[i-1] + (1<<lg[i-1] == 1); ``` 改为 ``` lg[i] = lg[i-1] + (1<<lg[i-1] == i); ``` 以及安利下我的模版 ```cpp #include<bits/stdc++.h> using namespace std; const int maxn=5e5+5; struct edge { int to,next; }e[maxn<<1]; int head[maxn],f[maxn][30+5],lg[maxn],dep[maxn]; int size=0; inline int read() { int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f; } void addedge(int u,int v) { e[++size].to=v;e[size].next=head[u];head[u]=size; } void dfs(int u,int fa) { dep[u]=dep[fa]+1; f[u][0]=fa; for(int i=1;i<=lg[dep[u]];i++) f[u][i]=f[f[u][i-1]][i-1]; for(int i=head[u];i;i=e[i].next) { int to=e[i].to; if(to==fa)continue; dfs(to,u); } } int lca(int x,int y) { if(dep[x]<dep[y]) swap(x,y); while(dep[x]>dep[y]) x=f[x][lg[dep[x]-dep[y]]]; if(x==y) return x; for(int i=lg[dep[x]];i>=0;i--) if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i]; return f[x][0]; } int main() { int n=read(),m=read(),s=read(); for(int i=1;i<=n-1;i++) { int u=read(),v=read(); addedge(u,v); addedge(v,u); } for(int i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<(lg[i-1]+1)==i); dfs(s,0); for(int i=1;i<=m;i++) { int x=read(),y=read(); printf("%d\n",lca(x,y)); } return 0; } ```
by Edward_Elric @ 2019-05-17 17:56:35


为啥要算log
by cosmicAC @ 2019-05-17 18:41:07


@[法兰西万岁](/space/show?uid=58707) 好啊,确实是我写错了
by SAOKA_ @ 2019-05-17 19:35:56


@[法兰西万岁](/space/show?uid=58707) 我感觉…我的模板跟你的…差不多?
by SAOKA_ @ 2019-05-17 19:38:00


@[法兰西万岁](/space/show?uid=58707) 改的那句话是什么意思啊dalao,太菜了刚学OI
by 红色OI再临 @ 2019-06-03 12:17:46


@[红色OI再临](/space/show?uid=57823) 就是处理以2为底的对数(+1),一个常数优化,因为需要多次调用
by Edward_Elric @ 2019-06-11 19:05:55


|