社区讨论
【求助各位大佬】TLE两个点
P3398仓鼠找 sugar参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pfsbj
- 此快照首次捕获于
- 2025/11/21 01:28 4 个月前
- 此快照最后确认于
- 2025/11/21 01:28 4 个月前
代码如下:
使用的倍增LCA:
CPP#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Max 100005
using namespace std;
int next[2*Max],fir[2*Max],to[2*Max],tot;
int f[Max][15],log_2[Max],dep[Max];
int n,q,u,v,a,b,c,d;
inline void Add(int x,int y){
next[++tot]=fir[x];fir[x]=tot;to[tot]=y;
}
inline void dfs(int now,int fa){
dep[now]=dep[fa]+1;f[now][0]=fa;
for(register int i = 1 ; (1<<i)<=dep[now]; ++i){
f[now][i]=f[f[now][i-1]][i-1];
}
for(register int i = fir[now]; i ; i= next[i]){
if(to[i]!=fa)dfs(to[i],now);
}
}
void presolve(){
for(register int i = 1 ; i <= Max ; ++i ){
log_2[i]=log_2[i-1]+(1<<log_2[i-1]==i);
}
dfs(1,0);
}
inline int LCA(int x,int y){
if(dep[x]<dep[y])swap(x,y);
while(dep[x]>dep[y]){
x=f[x][log_2[dep[x]-dep[y]]-1];
}
if(x==y)return x;
int D = dep[x];
for(register int i = log_2[D]-1;i>=0;--i){
if(f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
}
return f[x][0];
}
void solve(){
int A=LCA(a,b),B=LCA(c,d);
if(dep[A]<dep[B]){
swap(A,B);
swap(a,c);
swap(b,d);
}
if(LCA(A,c)==A||LCA(A,d)==A)putchar('Y');
else putchar('N');
putchar('\n');
return;
}
int read(){
int res=0,f=1;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while('0'<=c&&c<='9'){
res=(res<<3)+(res<<1)+c-'0';
c=getchar();
}
return f*res;
}
int main(){
n=read();q=read();
for(register int i = 1 ; i <= n-1; ++i){
u=read();v=read();
Add(u,v);Add(v,u);
}
presolve();
for(register int i = 1 ; i <= q; ++i){
a=read();b=read();c=read();d=read();
solve();
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...