求助
查看原帖
求助
59361
找不到该用户楼主2022/10/6 20:48

洛谷月赛div2t3(就是那题重的)在比赛交了3发都挂了,然后比完听说atcoder有重题,重的题交完ac了。这是spj的锅还是程序错误如果程序有问题是哪里

这是代码

#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,tt=0,l=-1,r=-1,maxlen,now,xx;
int a[4000010],b[4000010],c[4000010],e[2000010],f[2000010],g[2000010],h[2000010];
bool ff;
struct stc
{
	int opt,x,k,ans;
}d[2000010];
bool cmp(stc a,stc b)
{
	return (a.x<b.x)||(a.x==b.x)&&(a.k<b.k);
}
void dfs(int t,int fa,int len)
{
	if (len>=maxlen)
	{
		maxlen=len;
		if (now==1) l=t;
		if (now==2) r=t;
	}
	int s=c[t];
	while (s)
	{
		if (a[s]!=fa) dfs(a[s],t,len+1);
		s=b[s];
	}
}
void dfs2(int t,int fa,int len)
{
	f[len]=t;
	if (t==r)
	{
		for (int i=1;i<=len;i++) g[i]=f[i];
		ff=true;
		return;
	}
	int s=c[t];
	while (s)
	{
		if (a[s]!=fa) dfs2(a[s],t,len+1);
		s=b[s];
		if (ff) return;
	}
}
void dfs3(int t,int fa,int len)
{
	int s=c[t];
	h[len]=t;
	for (int i=e[t];i<e[t+1];i++) if (d[i].k<=len)
	{
		d[i].ans=h[len-d[i].k];
	} else
	{
		int tem=d[i].k-len,now=h[0];
		if (f[now]+tem<=maxlen) d[i].ans=g[f[now]+tem];
		if (f[now]-tem>=1) d[i].ans=g[f[now]-tem];
	}
	while (s)
	{
		if (a[s]!=fa)
			if (f[a[s]]==-1) dfs3(a[s],t,len+1); else dfs3(a[s],t,0);
		s=b[s];
	}
}
bool cmp2(stc a,stc b)
{
	return a.opt<b.opt;
}
int main()
{
	scanf("%d",&n);
	scanf("%d",&m);
	for (int i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		a[++tt]=x;b[tt]=c[y];c[y]=tt;
		a[++tt]=y;b[tt]=c[x];c[x]=tt;
	}
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&d[i].x,&d[i].k);
		d[i].opt=i;d[i].ans=-1;
	}
	sort(d+1,d+1+m,cmp);
	d[0].x=0;
	for (int i=0;i<=n;i++) e[i]=-1;
	for (int i=1;i<=m;i++) if (d[i-1].x!=d[i].x) e[d[i].x]=i;
	e[d[m].x+1]=m+1;
	for (int i=d[m].x;i>=1;i--) if (e[i]==-1) e[i]=e[i+1];
	maxlen=0;
	now=1;
	dfs(1,0,1);
	now=2;
	dfs(l,0,1);
	ff=false;
	dfs2(l,0,1);
	for (int i=1;i<=n;i++) f[i]=-1;
	for (int i=1;i<=maxlen;i++) f[g[i]]=i;
	dfs3(l,0,0);
	sort(d+1,d+1+m,cmp2);
	for (int i=1;i<=m;i++) printf("%d\n",d[i].ans);
}
2022/10/6 20:48
加载中...