求助昨天下午比赛DIV2的T3为什么暴力全TLE了
  • 板块学术版
  • 楼主qip101
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/5 08:27
  • 上次更新2023/10/27 08:45:30
查看原帖
求助昨天下午比赛DIV2的T3为什么暴力全TLE了
333800
qip101楼主2022/10/5 08:27
#include <bits/stdc++.h>
#define MAXN 1001000
using namespace std;
int n,q,far,fa[MAXN],dis[MAXN],vis[MAXN];
vector <int> G[MAXN];
inline int read(){
   register int s=0,w=1;//s是数值,w是符号 
   register char ch=getchar(); 
   while(ch<'0'||ch>'9'){//将空格、换行与符号滤去 
        if(ch=='-'){//出现负号表示是负数 
            w=-1;
            ch=getchar();//继续读入
        }
   }
   while(ch>='0'&&ch<='9'){//循环读取每一位的数字 
        s=s*10+ch-'0';//将每一位的结果累加进s 
        ch=getchar();
   }
   return s*w;//乘上符号 
}
inline void add(int u,int v)
{
	G[u].push_back(v);
	G[v].push_back(u);
}
inline bool dfs(int u,int f,int k)//判断是不是-1
{
	fa[u]=f;
	if(dis[u]>dis[far])
		far=u;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i],w=1;
		if(v==f || vis[v])
			continue;
		dis[v]=dis[u]+1;
		dfs(v,u,k);
	}
	return dis[far]<k;
}
inline int DFS(int u,int f,int k)//输出距离k的点
{
	if(dis[far]==k)
		return far;
	fa[u]=f;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(v==f || vis[v])
			continue;
		dis[v]=dis[u]+1;
		dfs(v,u,k);
	}
}
int main()
{
	/*freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);*/
	n=read();q=read();
	for(register int i=1;i<=n-1;i++)
	{
		int u,v;
		u=read();v=read();
		add(u,v);
	}
	while(q--)
	{
		int x,k;
		x=read();k=read();
		dis[x]=0;
		if(k==0)//特判
			printf("%d\n",x);
		else if(dfs(x,0,k))
			printf("%d\n",-1);
		else
			printf("%d\n",DFS(x,0,k));
	}
	return 0;
}
2022/10/5 08:27
加载中...