P8943 样例过了但10pts 悬二关求条QMQ
  • 板块灌水区
  • 楼主20090818Cc
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/3 20:12
  • 上次更新2025/1/3 21:51:00
查看原帖
P8943 样例过了但10pts 悬二关求条QMQ
1268457
20090818Cc楼主2025/1/3 20:12
#include<bits/stdc++.h>
using namespace std;
const int M=5e6+110;
int read(){
	int sum=0,k=1;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-')k=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		sum=sum*10+c-'0';
		c=getchar();
	}
	return sum*k;
}
struct w{
	int next,to;
}e[M];
int head[M],k=0;
void add(int u,int v){
	e[++k].next=head[u];
	e[k].to=v;
	head[u]=k;
}
int n,q;
//找环 
int dfn[M],time_stamp=0,len=0,fa[M],loop[M];
bool inring[M];
void find_dfs(int u){
	dfn[u]=++time_stamp;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to; 
		if(v!=fa[u]){
			if(dfn[v]==0){
				fa[v]=u;
				find_dfs(v);
			} 
			else if(dfn[v]>=dfn[u]){
					loop[++len]=u;
					inring[u]=true;
//					printf("%lld\n",u);
					for(int j=v;j!=u;j=fa[j]){
//						printf("%lld\n",v);
						loop[++len]=j;
						inring[fa[j]]=true;
					}
			} 
		}
	}
}

int dis[M],toring[M];
void dis_dfs(int u,int ft,int to_ring_id){
	toring[u]=to_ring_id;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v!=fa[u]&&inring[v]==0){
			dis[v]=dis[u]+1;
			dis_dfs(v,u,to_ring_id);
		}
	}
}

signed main(){
	n=read(),q=read();
	for(int i=1;i<=n;i++){
		int u=read(),v=read();
		add(v,u),add(u,v);
	}
	find_dfs(1);
//	for(int i=1;i<=len;i++)printf("%lld ",loop[i]);
	for(int i=1;i<=len;i++)dis_dfs(loop[i],0,i);
//	printf("\n");
	while(q--){
		int x=read(),y=read();
		int d1=dis[x],d2=dis[y],t1=toring[x],t2=toring[y];
//		cout<<d2<<" "<<d2+min(abs(t1-t2),len-abs(t1-t2))<<" "<<d1<<endl;
		if(d2+min(abs(t1-t2),len-abs(t1-t2))>d1) printf("Survive\n");
		else printf("Deception\n");
	}
	
	return 0;
}

感觉脑袋尖尖的

2025/1/3 20:12
加载中...