(小喵喵:呜呜呜呜呜...人家...)
小喵喵用了 割边+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;
}