样例卡死,一交T飞
查看原帖
样例卡死,一交T飞
1268524
DX3906_ourstar楼主2024/9/16 16:40

rt,用的倍增

#include<iostream>
#include<cstring>
#define re register
using namespace std;

const int N = 1e6 + 5;

int p[N][19],d[N],head[N];
int n,q,cnt;
bool vis[N];

struct edge{
    int v,next;
}e[N];

inline int jdz(int x){
	return (x < 0 ? -x : x);
}

inline void add(int u,int v){
    cnt ++;
	e[cnt].v = v;
    e[cnt].next = head[u];
    head[u] = cnt;
	return ;
}

inline void dfs(int u,int fa){
	cout<<"RUN\n";
    d[u] = d[fa] + 1;
    p[u][0] = fa;
    for(re int i = head[u];i != -1;i = e[i].next){
        int v = e[i].v;
        if(v == fa){
        	continue;
		}else{
			dfs(v,u);
		}
    }
    return ;
}

inline int LCA(int a,int b){
    if(d[a] < d[b]){
    	swap(a,b);
	}
    for(re int i = 20;i >= 0;i --){
        if(d[p[a][i]] >= d[b]){
        	a = p[a][i];
		}
    }
    if(a == b){
    	return a;
	}
    for(re int i = 20;i >= 0;i --){
        if(p[a][i]!=p[b][i]){
            a = p[a][i];
            b = p[b][i];
        }
    }
    return p[a][0];
}

inline int cal(int x,int y){
    int c = LCA(x,y);
    return jdz(d[c] - d[x]) + jdz(d[c] - d[y]);
}

inline void init(){
    for(re int j = 1;j < 19;j ++){
        for(re int i = 1;i <= n;i ++){
            p[i][j] = p[p[i][j - 1]][j - 1];
        }
    }
}

inline void cs(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	memset(head,-1,sizeof(head));
	return ;
}

int main(){
    cin>>n>>q;
    for(re int i = 1;i <= n - 1;i++){
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs(1,0);
    init();
    for(re int i = 1;i <= q;i ++){
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        int x = LCA(a,b),y = LCA(c,d);
        if(cal(x,c) + cal(x,d) == cal(c,d)){
        	cout<<"Y";
		}else if(cal(y,a) + cal(y,b) == cal(a,b)){
			cout<<"Y";
		}else{
			cout<<"N";
		}
		cout<<"\n";
    }
    return 0;
}
2024/9/16 16:40
加载中...