爆栈??!!
查看原帖
爆栈??!!
549499
Disjoint_cat楼主2022/11/12 15:38

首先,我写出了这样的代码:

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int N=500005,LOG=17;
int n,m,root,u,v,Log[N]={-1},dep[N],fa[N][LOG];
int head[N],to[N<<1],nxt[N<<1],tot;
void addE(int u,int v){to[++tot]=v,nxt[tot]=head[u],head[u]=tot;}
void initlog(){for(int i=2;i<=n;i++)Log[i]=Log[i-1]+!(i&(i-1));}
void dfs(int now,int Fa,int Dep)
{
	dep[now]=Dep,fa[now][0]=Fa;
	for(int i=1;i<=Log[Dep];i++)
		fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];i;i=nxt[i])
		if(to[i]!=Fa)dfs(to[i],now,Dep+1);
}
int query(int s,int t)
{
	if(dep[s]<dep[t])swap(s,t);
	for(int i=Log[dep[s]-dep[t]];~i;--i)
		if(dep[s]-(1<<i)>=dep[t])s=fa[s][i];
	//cout<<s<<" "<<t<<'\n';
	if(s==t)return s;
	for(int i=Log[dep[s]];~i;--i)
		if(fa[s][i]!=fa[t][i])s=fa[s][i],t=fa[t][i];
	return fa[s][0];
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>root;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		addE(u,v);addE(v,u);
	}
	initlog();
	dfs(root,0,0);
	while(m--)
	{
		cin>>u>>v;
		cout<<query(u,v)<<'\n';
	}
	return 0;
}

然后,结果

我看了一下别人的提交记录,发现被Hack数据卡的大多是TLE。但是为何是WA???

我下载了数据,发现本机上跑不出答案,RE了。

然后,我在C++里改了编译选项-Wl,--stack=16777216然后答案完全正确。

当时我还只是怀疑是爆栈,但当我看到改后的代码(只改了dfs部分,把参数改成了全局变量)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=500005,LOG=20;
int n,m,root,u,v,Log[N]={-1},dep[N],fa[N][LOG],Fa,Dep;
int head[N],to[N<<1],nxt[N<<1],tot;
void addE(int u,int v){to[++tot]=v,nxt[tot]=head[u],head[u]=tot;}
void initlog(){for(int i=2;i<N;i++)Log[i]=Log[i-1]+!(i&(i-1));}
stack<int>lst;
void dfs(int now)
{
	dep[now]=Dep,fa[now][0]=Fa;
	for(int i=1;i<=Log[Dep];i++)
		fa[now][i]=fa[fa[now][i-1]][i-1];
	lst.push(Fa),Fa=now,Dep++;
	for(int i=head[now];i;i=nxt[i])
		if(to[i]!=lst.top())dfs(to[i]);
	Dep--,Fa=lst.top(),lst.pop();
}
int query(int s,int t)
{
	if(dep[s]<dep[t])swap(s,t);
	for(int i=Log[dep[s]-dep[t]];~i;--i)
		if(dep[s]-(1<<i)>=dep[t])s=fa[s][i];
	//cout<<s<<" "<<t<<'\n';
	if(s==t)return s;
	for(int i=Log[dep[s]];~i;--i)
		if(fa[s][i]!=fa[t][i])s=fa[s][i],t=fa[t][i];
	return fa[s][0];
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>root;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		addE(u,v);addE(v,u);
	}
	initlog();
	dfs(root);
	while(m--)
	{
		cin>>u>>v;
		cout<<query(u,v)<<'\n';
	}
	return 0;
}

AC了的时候,我感觉是不是评测机真的炸了。

2022/11/12 15:38
加载中...