社区讨论

55pts,悬关求调!

P2783有机化学之神偶尔会做作弊参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m4253ytv
此快照首次捕获于
2024/11/29 10:44
去年
此快照最后确认于
2025/11/04 13:41
4 个月前
查看原帖
两个tle,三个wa
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
stack<int> st;
vector<int> g[maxn],tr[maxn];
int n,m,cnt,dfn[maxn],low[maxn];
int dep[maxn],ccnt,ccno[maxn],f[maxn][15];

void bcc(int v){
	ccnt++;
	int nw;
	do{
		nw=st.top();
		st.pop();
		ccno[nw]=ccnt;
	}while(nw!=v);
}

void tarjan(int u,int fa){
	st.push(u);
	dfn[u]=low[u]=++cnt;
	for(int v:g[u]){
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(dfn[u]<low[v]) bcc(v);
		}else if(v!=fa) low[u]=min(low[u],dfn[v]);
	}if(u==fa) bcc(u);
}

void dfs(int u,int fa){
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(int v:tr[u])
		if(v!=fa) dfs(v,u);
}

void bin(int num){
	if(!num) return;
	bin(num>>1);
	putchar((num&1)+'0');
}

int lca(int u,int v){
	if(dep[u]>dep[v]) swap(u,v);
	for(int i=15;i>=0;i--)
		if(dep[f[v][i]]>=dep[u]){
			v=f[v][i];
			if(dep[v]==dep[u]) break;
		}
	if(u==v) return u;
	for(int i=log2(dep[v]);i>=0;i--)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	return f[v][0];
}

int main(){
	int u,v,tot;
	scanf("%d%d",&n,&m);
	while(m--){
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}tarjan(1,1);
	for(int i=1;i<=n;i++)
		for(int j:g[i])
			if(ccno[i]!=ccno[j]){
				tr[ccno[i]].push_back(ccno[j]);
				tr[ccno[j]].push_back(ccno[i]);
			}
	dfs(1,0);
	for(int i=1;i<15;i++)
		for(int u=1;u<=ccnt;u++)
			f[u][i]=f[f[u][i-1]][i-1];
	scanf("%d",&tot);
	while(tot--){
		scanf("%d%d",&u,&v);
		int ca=lca(ccno[u],ccno[v]);
		int ans=dep[ccno[u]]+dep[ccno[v]]-dep[ca]*2+1;
		if(!ans) printf("0\n");
		else{
			bin(ans);
			putchar('\n');
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...