63pts 全MLE || 喵喵求助
查看原帖
63pts 全MLE || 喵喵求助
818000
xxmb楼主2024/11/3 16:44

(小喵喵:呜呜呜呜呜...人家...)

小喵喵用了 割边+lca 但是只有63pts,MLE了 # 7 # 9 # 10 # 11 ...(委屈...

到底哪里错了呀...(急得眼泪在眼眶里打转了嗷呜...

拜托大佬们给看看...(害羞得小脸泛红...

拜托各位大佬了...(喵喵~

下面这是小喵喵我的代码... 写的不好大佬们别骂小喵喵...调了一个小时了实在没发现哪里有错误(哭

#include<bits/stdc++.h>
using namespace std;
int n,m,u[50010],v[50010],q,a,b,pp,op[200];
struct node{
	int to,nxt;
}edge[100100];
map<pair<int,int> ,int > mp;
int head[10010],tot;
void add(int u,int v){
	mp[{u,v}]=1;
	edge[++tot].to=v;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
int dfn[10010],low[10010],cnt,id[10100],deep[10100];
bool vis[100100];
void tarjan(int x,int lst){
	dfn[x]=low[x]=++cnt;
	for(int i=head[x];i;i=edge[i].nxt){
		if(i==(lst^1))
			continue;
		int y=edge[i].to;
		if(!dfn[y]){
			tarjan(y,i);
			low[x]=min(low[x],low[y]);
			if(low[y]>dfn[x])
				vis[i]=vis[i^1]=1;
		}
		else low[x]=min(low[x],dfn[y]);
	}
}
void dfs1(int x,int fa){
	id[x]=pp;
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y==fa||vis[i]||vis[i^1])
			continue;
		dfs1(y,x);
	}
}
int f[10100][15],lg[10100];
void dfs2(int x,int fa){
	dfn[x]=++cnt;
	deep[x]=deep[fa]+1;
	f[cnt][0]=fa;
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y!=fa)
			dfs2(y,x);
	}
}
int get(int x,int y){
	if(dfn[x]<dfn[y])
		return x;
	return y;
}
int Lca(int x,int y){
	if(x==y)
		return x;
	x=dfn[x],y=dfn[y];
	if(x>y)
		swap(x,y);
	int len=y-x;
	return get(f[x+1][lg[len]],f[y-(1<<lg[len])+1][lg[len]]);
}

signed main(){
	scanf("%d%d",&n,&m);
	tot=1;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u[i],&v[i]);
		if(mp[{u[i],v[i]}])
			continue;
		add(u[i],v[i]);
		add(v[i],u[i]);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			tarjan(i,0);
	for(int i=1;i<=n;i++)
		if(!id[i]){
			pp++;
			dfs1(i,i);
		}
	for(int i=1;i<=n;i++)
		head[i]=0;
	tot=0;
	mp.clear();
	for(int i=1;i<=m;i++){
		if(id[u[i]]==id[v[i]])
			continue;
		if(mp[{id[u[i]],id[v[i]]}])
			continue;
		add(id[u[i]],id[v[i]]);
		add(id[v[i]],id[u[i]]);
	}
	n=pp;
	cnt=0;
	for(int i=1;i<=n;i++)
		if(!deep[i])
			dfs2(i,0);
	for(int i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	for(int i=1;i<=lg[n];i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			f[j][i]=get(f[j][i-1],f[j+(1<<(i-1))][i-1]);
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&a,&b);
		a=id[a],b=id[b];
		int lca=Lca(a,b),ans=deep[a]+deep[b]-deep[lca]*2+1,k=0;
		while(ans){
			op[++k]=(ans&1);
			ans>>=1;
		}
		for(int i=k;i>=1;i--)
			cout<<op[i];
		cout<<"\n";
	}
	return 0;
}
2024/11/3 16:44
加载中...