10分悬关!!
查看原帖
10分悬关!!
547787
__Refine__楼主2024/11/18 20:27
#include<bits/stdc++.h>
#define int long long
using namespace std;

struct bian
{
	int to,nxt;
}b[400005];
int dian[200005],tot;
int n,p,du[200005],sig[200005],dis1[200005],dis2[200005];
queue<int>q;
bool bok[200005];
void add(int x,int y)
{
	b[++tot].nxt=dian[x];
	b[tot].to=y;
	dian[x]=tot;
	du[x]++;
}
void dfs1(int x,int fa,int rot,int dis)
{
	sig[x]=rot;
	for(int i=dian[x];i;i=b[i].nxt)
	{
		int v=b[i].to;
		if(v==fa||!bok[v])continue;
		dis1[v]=dis+1;
		dfs1(v,x,rot,dis+1);
	}
}
void dfs2(int x,int fa,int rot,int dis)
{
	dis2[x]=dis;
	for(int i=dian[x];i;i=b[i].nxt)
	{
		int v=b[i].to;
		if(v==fa||v==rot)continue;
		dfs2(v,x,rot,dis+1);
	}
}
signed main()
{
	cin>>n>>p;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++){
		if(du[i]==1)q.push(i);
	}
	while(!q.empty())
	{
		int t=q.front();
		q.pop();
		if(bok[t])continue;
		bok[t]=true;
		for(int i=dian[t];i;i=b[i].nxt)
		{
			int c=b[i].to;
			du[c]--;
			if(du[c]==1)q.push(c);
		}
	}
	int all=0;
	for(int i=1;i<=n;i++)
	{
		if(!bok[i])dfs1(i,0,i,0),all++;
	}
	for(int i=1;i<=n;i++)
	{
		if(!bok[i])
		{
			dfs2(i,0,i,1);
			break;
		}
	}
	for(int i=1;i<=p;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		if(sig[x]==sig[y])
		{
			if(dis1[x]>=dis1[y])cout<<"Deception11"<<endl;
			else cout<<"Survive"<<endl; 
		}
		else
		{
			int t1=abs(dis2[sig[x]]-dis2[sig[y]]);
			int t2=t1>all-t1?all-t1:t1;
			if(t2+dis1[y]<=dis1[x])cout<<"Deception"<<endl;
			else cout<<"Survive"<<endl;
		}
	}
	return 0;
 }
2024/11/18 20:27
加载中...