所以为什么WA?
查看原帖
所以为什么WA?
416975
sbno333楼主2024/1/8 23:36

这是一份60分的代码,WA in 1,10,TLE in 8,9.

#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
	int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
void dfs(int t){
	for(int i=h[t];i;i=sd[i].ne){
		if(sd[i].v!=fa[t]){
			fa[sd[i].v]=lca[sd[i].v][0]=t;
			s[sd[i].v]=s[t]+1;
			dfs(sd[i].v);
		}
	}
}
int lcc(int a,int b){
	if(s[a]<s[b]){
		swap(a,b);
	}
	for(int i=20;i>=0;i--){
		if(s[lca[a][i]]>=s[b]){
			a=lca[a][i];
		}
	}
	if(a==b){
		return a;
	}
	for(int i=20;i>=0;i--){
		if(lca[a][i]!=lca[b][i]){
			a=lca[a][i];
			b=lca[b][i];
		}
	}
	return fa[a];
}
int x,y,z;
int jl(int a,int b){
	int c;
	c=lcc(a,b);
	return s[a]-s[c]+s[b]-s[c];
}
int zjl(int s){
	return jl(x,s)+jl(y,s)+jl(z,s);
}
signed main(){
	std::ios::sync_with_stdio(0);
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
		swap(u,v);
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
	}
	dfs(1);
	for(int i=1;i<=20;i++){
		for(int j=1;j<=n;j++){
			lca[j][i]=lca[lca[j][i-1]][i-1];
		}
	}
	for(int i=1;i<=q;i++){
		cin>>x>>y>>z;
		int ans,aa;
		ans=0;
		aa=lcc(x,y);
		ans=zjl(aa);
		if(zjl(lcc(x,z))<ans){
			aa=lcc(x,z),ans=zjl(aa);
		}
			
		if(zjl(lcc(y,z))<ans){
			aa=lcc(y,z),ans=zjl(aa);
		}
			
		cout<<aa<<" "<<ans<<endl;
	}
	return 0;
} 

显然,常数太大,但是不知道哪里WA,接下来就是神奇的操作了。

看题解后进行了小修改,将末尾修改。

90分,WA in 1.

#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
	int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
	for(register int i=h[t];i;i=sd[i].ne){
		if(sd[i].v!=fa[t]){
			fa[sd[i].v]=lca[sd[i].v][0]=t;
			s[sd[i].v]=s[t]+1;
			dfs(sd[i].v);
		}
	}
}
inline int lcc(register int a,register int b){
	if(s[a]<s[b]){
		swap(a,b);
	}
	for(register int i=20;i>=0;i--){
		if(s[lca[a][i]]>=s[b]){
			a=lca[a][i];
		}
	}
	if(a==b){
		return a;
	}
	for(register int i=20;i>=0;i--){
		if(lca[a][i]!=lca[b][i]){
			a=lca[a][i];
			b=lca[b][i];
		}
	}
	return fa[a];
}
int x,y,z;
signed main(){
    std::ios::sync_with_stdio(0);
    cin.tie(0);//小优化对AC与WA影响不大
	cin>>n>>q;
	for(register int i=1;i<n;i++){
		register int u,v;
		cin>>u>>v;
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
		swap(u,v);
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
	}
	dfs(1);
	for(register int i=1;i<=20;i++){
		for(register int j=1;j<=n;j++){
			lca[j][i]=lca[lca[j][i-1]][i-1];
		}
	}
	for(register int i=1;i<=q;i++){
		cin>>x>>y>>z;
		register int ans,a1,a2,a3,aa;
		ans=0;
		a1=lcc(x,y);//修改部分
		a2=lcc(y,z);
		a3=lcc(x,z);
		if(a1==a2){
			aa=a3;
		}
		if(a1==a3){
			aa=a2;
		}
		if(a3==a2){
			aa=a1;
		}	
		ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];//修改结束
		cout<<aa<<" "<<ans<<"\n";
	}
	return 0;
} 

接着我开始瞎搞,修改了默认根节点编号,90pts,WA in 10。

#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
	int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
	for(register int i=h[t];i;i=sd[i].ne){
		if(sd[i].v!=fa[t]){
			fa[sd[i].v]=lca[sd[i].v][0]=t;
			s[sd[i].v]=s[t]+1;
			dfs(sd[i].v);
		}
	}
}
inline int lcc(register int a,register int b){
	if(s[a]<s[b]){
		swap(a,b);
	}
	for(register int i=20;i>=0;i--){
		if(s[lca[a][i]]>=s[b]){
			a=lca[a][i];
		}
	}
	if(a==b){
		return a;
	}
	for(register int i=20;i>=0;i--){
		if(lca[a][i]!=lca[b][i]){
			a=lca[a][i];
			b=lca[b][i];
		}
	}
	return fa[a];
}
int x,y,z;
signed main(){
    std::ios::sync_with_stdio(0);
    cin.tie(0);
	cin>>n>>q;
	for(register int i=1;i<n;i++){
		register int u,v;
		cin>>u>>v;
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
		swap(u,v);
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
	}
	dfs(2);//改了个数
	for(register int i=1;i<=20;i++){
		for(register int j=1;j<=n;j++){
			lca[j][i]=lca[lca[j][i-1]][i-1];
		}
	}
	for(register int i=1;i<=q;i++){
		cin>>x>>y>>z;
		register int ans,a1,a2,a3,aa;
		ans=0;
		a1=lcc(x,y);
		a2=lcc(y,z);
		a3=lcc(x,z);
		if(a1==a2){
			aa=a3;
		}
		if(a1==a3){
			aa=a2;
		}
		if(a3==a2){
			aa=a1;
		}	
		ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];
		cout<<aa<<" "<<ans<<"\n";
	}
	return 0;
} 

最后,我又换了根,A了(但是显然是数据的原因)。

#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
	int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
	for(register int i=h[t];i;i=sd[i].ne){
		if(sd[i].v!=fa[t]){
			fa[sd[i].v]=lca[sd[i].v][0]=t;
			s[sd[i].v]=s[t]+1;
			dfs(sd[i].v);
		}
	}
}
inline int lcc(register int a,register int b){
	if(s[a]<s[b]){
		swap(a,b);
	}
	for(register int i=20;i>=0;i--){
		if(s[lca[a][i]]>=s[b]){
			a=lca[a][i];
		}
	}
	if(a==b){
		return a;
	}
	for(register int i=20;i>=0;i--){
		if(lca[a][i]!=lca[b][i]){
			a=lca[a][i];
			b=lca[b][i];
		}
	}
	return fa[a];
}
int x,y,z;
signed main(){
    std::ios::sync_with_stdio(0);
    cin.tie(0);
	cin>>n>>q;
	for(register int i=1;i<n;i++){
		register int u,v;
		cin>>u>>v;
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
		swap(u,v);
		sd[++inn].v=v;
		sd[inn].ne=h[u];
		h[u]=inn;
	}
	dfs(3);//改了个数
	for(register int i=1;i<=20;i++){
		for(register int j=1;j<=n;j++){
			lca[j][i]=lca[lca[j][i-1]][i-1];
		}
	}
	for(register int i=1;i<=q;i++){
		cin>>x>>y>>z;
		register int ans,a1,a2,a3,aa;
		ans=0;
		a1=lcc(x,y);
		a2=lcc(y,z);
		a3=lcc(x,z);
		if(a1==a2){
			aa=a3;
		}
		if(a1==a3){
			aa=a2;
		}
		if(a3==a2){
			aa=a1;
		}	
		ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];
		cout<<aa<<" "<<ans<<"\n";
	}
	return 0;
} 

提交了两页多,帮帮我吧。

2024/1/8 23:36
加载中...