15分,悬棺
查看原帖
15分,悬棺
768325
Herbie_ZHB楼主2024/12/1 06:56
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int M=N<<1;
int n,q,A,B;
bool inloop[N],vis[N];
int dis[N],fa[N],nxt[M],head[N],to[M],tot,disl[N],anc[N],ANC,inl[N];
string yes="Survive",no="Deception";
vector<int> a;
void add(int u,int v){
	tot++;nxt[tot]=head[u];head[u]=tot;to[tot]=v;
}
void dfs(int u){
	vis[u]=1;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==fa[u])continue;
		if(vis[v]){
			A=u;
		    B=v;
		    continue;
		}
		dis[v]=dis[u]+1;
		vis[v]=1;
		fa[v]=u;
		dfs(v);
	}
}
void dfs1(int u){
	vis[u]=1;
//	if(u==4)cout<<4<<endl;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
//		if(v==fa[u])continue;
		
		if(inloop[v])continue;
		if(vis[v])continue;
		disl[v]=disl[u]+1;
//		fa[v]=u;
		vis[v]=1;
		anc[v]=ANC;
		dfs1(v);//*****
	}
}
void buildloop(int u){
    for(int i=head[u];i;i=nxt[i]){
    	int v=to[i];
        if(vis[v]){
        	continue;	
        }
        if(!inloop[v])continue;
        vis[v]=1;
        inl[v]=inl[u]+1;
        buildloop(v);
    }
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	vis[1]=1;
	dfs(1);
	memset(vis,0,sizeof(vis));
	int x=A;
	while(x){
		inloop[x]=1;
		x=fa[x];
	}
    x=B;
	while(x){
		inloop[x]=1;
		x=fa[x];
	}
	int cnt=0;
	memset(fa,0,sizeof(fa));
	int k=0;
	for(int i=1;i<=n;i++){
		if(inloop[i]){
//			cout<<i<<endl;
			k=i;
			ANC=i;
			dfs1(i);
			cnt++;
		}
	}
	memset(vis,0,sizeof(vis));
	vis[k]=1;
	buildloop(k);
    while(q--){
    	int x,y;
    	scanf("%d%d",&x,&y);
    	if(inloop[x]&&inloop[y]){
    		cout<<yes<<endl;
    	}else if(inloop[x]&&!inloop[y]){
    		cout<<yes<<endl;
    	}else if(!inloop[x]&&inloop[y]){
    		int dx=disl[x],dy=min(abs(inl[anc[x]]-inl[y]),cnt-abs(inl[anc[x]]-inl[y]));
    	    if(dx>=dy){
    	    	cout<<no<<endl;
    	    }else{
    	    	cout<<yes<<endl;
    	    }
    	}else{
    		int dx=disl[x],dy=disl[y];
    	    int d=min(abs(inl[anc[x]]-inl[anc[y]]),cnt-abs(inl[anc[x]]-inl[anc[y]]));//***
    	    dy+=d;
    	    if(dx>=dy){
    	    	cout<<no<<endl;
    	    }else cout<<yes<<endl;
    	}
    }
	return 0;
}
2024/12/1 06:56
加载中...