#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还是其他问题