求助卡常
查看原帖
求助卡常
677440
ifffer_2137楼主2024/4/27 22:17

TLE on #57,真不会卡常了,有没有dalao教一下哪里能优化。

//From: ifffer_2137
#include <bits/stdc++.h>
using namespace std;
inline int read(){
    char ch=getchar();int x=0,w=1;
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();return w==1?x:-x;
}
const int maxn=5e5+5;
int T;
int n,m;
vector<int> tr[maxn];
vector<int> rg[maxn];
vector<int> lf;
int fa[maxn][20],dep[maxn],low[maxn];
void dfs(int u,int f){
	dep[u]=dep[f]+1;
	fa[u][0]=f;
	for(int i=1;i<=19;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int v:tr[u]){
		if(v==f) continue;
		dfs(v,u);
	}
}
inline int lca(int u,int v){
	if(dep[u]<dep[v]){
		u^=v;
		v^=u;
		u^=v;
	}
	for(int i=19;i>=0;i--){
		if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
	}
	if(u==v) return u;
	for(int i=19;i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
bool cmp(int x,int y){
	return dep[low[x]]<dep[low[y]];
}
void solve(){
	for(int i=1;i<=n;i++){
		tr[i].clear();
		rg[i].clear();
	}
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		tr[u].emplace_back(v);
		tr[v].emplace_back(u);
	}
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		rg[u].emplace_back(v);
		rg[v].emplace_back(u);
	}
	dfs(1,0);
	lf.clear();
	for(int u=1;u<=n;u++){
		low[u]=u;
		if(tr[u].size()==1){
			lf.push_back(u);
			for(int v:rg[u]){
				int f=lca(u,v);
				if(dep[f]<dep[low[u]]) low[u]=f;
			}
		}
	}
	sort(lf.begin(),lf.end(),cmp);
	for(int i=0;i<lf.size()-1;i++){
		int u=low[lf[i]],v=low[lf[i+1]];
		int f=lca(u,v);
		if(f!=u){
			cout<<"NO"<<endl;
			cout<<lf[i]<<" "<<lf[i+1]<<endl;
			return;
		}
	}
	int rt=low[lf.back()];
	dfs(rt,0);
	for(int u:lf){
		int l=u;
		for(int v:rg[u]){
			int f=lca(u,v);
			if(dep[f]<dep[l]) l=f;
		}
		if(l!=rt){
			cout<<"NO"<<endl;
			cout<<u<<" "<<lf.back()<<endl;
			return;
		}
	}
	cout<<"YES"<<endl;
}
signed main(){
	cin.tie(0),cout.tie(0);
	T=read();
	while(T--){
		solve();
	}
	return 0;
}
2024/4/27 22:17
加载中...