为什么数组改大了就过了?
查看原帖
为什么数组改大了就过了?
865793
better_Z楼主2024/7/7 16:50
#include<iostream>
using namespace std;
#define maxn 100010
int anc[maxn][19];
int n,q;
int head[maxn],cnt=0;
int dep[maxn];
bool vis[maxn];
struct E{
    int nxt,to;
}e[maxn*2];
void add(int a,int b){
    e[++cnt].to=b;
    e[cnt].nxt=head[a];
    head[a]=cnt;
}
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    anc[u][0]=fa;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa)continue;
        dfs(v,u);
    }
}
void init(){
    for(int j=1;j<19;j++){
        for(int i=1;i<=n;i++){
            anc[i][j]=anc[anc[i][j-1]][j-1];
        }
    }
}
int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i=18;i>=0;i--){
        if(dep[anc[x][i]]>=dep[y])x=anc[x][i];
    }
    if(x==y)return x;
    for(int i=18;i>=0;i--){
        if(anc[x][i]!=anc[y][i]){
            x=anc[x][i];
            y=anc[y][i];
        }
    }
    return anc[x][0];
}
int cal(int x,int y){
    int c=lca(x,y);
    return abs(dep[c]-dep[x])+abs(dep[c]-dep[y]);
}
int main(){
    cin>>n>>q;
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs(1,0);
    init();
    while(q--){
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        int x=lca(a,b);int y=lca(c,d);
        if(cal(x,c)+cal(x,d)==cal(c,d))cout<<"Y"<<endl;
        else if(cal(y,a)+cal(y,b)==cal(a,b))cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }
    return 0;
}

把maxn改成200010就过了,100010反而会mle???

2024/7/7 16:50
加载中...