这题#11专卡tarjan
查看原帖
这题#11专卡tarjan
361794
Gyan楼主2021/10/9 20:03
#include <bits/stdc++.h>
#define rg register
inline int read() {
	register int x(0);
	register bool f(0);
	register char c(getchar());
	while (c<48/*||c>57*/) {if(c=='-')f=1;c=getchar();}
	while (c>47/*&&c<58*/) x=(x<<1)+(x<<3)+(c^48), c=getchar();
	return f?-x:x;
}
template<typename _Tp>
 void write(_Tp x) {
	if (x<0) x=-x, putchar('-');
	if (x>9) write(x/10);
	putchar(x%10|48);
}
using namespace std;

#define N 500030
#define M 1000030
#define Q N

int n, qm, s;
int head[N], nxt[M], to[M], tot;

inline void add(int x ,int y) {
	nxt[++tot] = head[x];
	head[x] = tot;
	to[tot] = y;
}

int first[N], cnt;
struct ques {
	int nxt, to, id;
} q[Q<<1];

inline void ask(int x, int y, int i) {
	q[++cnt].nxt = first[x];
	first[x] = cnt;
	q[cnt].to = y;
	q[cnt].id = i;
}

int fa[N], lca[Q];
bool vis[N];

int getfa(int x) {
	if (x == fa[x]) return x;
	return fa[x] = getfa(fa[x]);
}

void dfs(int x, int from) {
	for (rg int e(head[x]); e; e=nxt[e])
		if (to[e] != from)
			dfs(to[e], x), fa[to[e]] = x;
	for (rg int i(first[x]); i; i=q[i].nxt)
		if (vis[q[i].to]) {
//			if (getfa(q[i].to)==0) lca[q[i].id] = s;
//			else 
			lca[q[i].id] = getfa(q[i].to);
		}
	vis[x] = 1;
}

signed main()
{
#ifndef ONLINE_JUDGE
	freopen("P3379_11.in", "r", stdin);//freopen(".out", "w", stdout);
#endif
	n=read(), qm=read(), s=read();
	for (rg int i(1), x, y; i<n; ++i) {
		x=read(), y=read();
		add(x, y), add(y, x);
		fa[i] = i;
	}
	fa[n] = n;
	for (rg int i(0), x, y; i<qm; ++i) {
		x=read(), y=read();
		ask(x, y, i), ask(y, x, i);
	}
	dfs(s, 0);
	for (rg int i(0); i<qm; ++i)
		write(lca[i]), putchar('\n');
	return 0;
}

其他点都A了,只有#11

你谷上记录#11显示该程序错误地输出了一个 0 ,而在本地 dev (学校渣机)上#11的数据运行了超过 1 s

我试过提交网上看到的本题tarjan写法和tj里的tarjan 也都wa了#11

(tj是16年的而#11是新加的)

求大佬解惑

是真的不能用tarjan还是其他问题

2021/10/9 20:03
加载中...