100分求助
查看原帖
100分求助
521283
wangif424楼主2023/9/11 13:04
#include <cstdio>
#include <iostream>
using namespace std;
char pbuf[32768], *pp = pbuf;
__inline void write(unsigned x) {
    unsigned sta[35], top = 0;
    do {
        sta[top++] = x % 10, x /= 10;
    } while (x);
    while (top) {
        if (pp - pbuf == 32768)
            fwrite(pbuf, 1, pp - pbuf, stdout), pp = pbuf;
        *pp++ = sta[--top] ^ '0';
    }
}
char buf[16777216], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 16777216, stdin), p1 == p2) ? EOF : *p1++)
__inline void R(unsigned &x) {
    x = 0;
    char ch = getchar();
    while (!isdigit(ch)) {
        ch = getchar();
    }
    while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
    return;
}
unsigned n, q, r;
struct b {
    unsigned id, to, nxt;
};
struct t {
    b v[20000100];
    unsigned len, fir[10000100];
    inline void add(unsigned x, unsigned y, unsigned id = 0) {
        ++len;
        v[len].id = id;
        v[len].to = y;
        v[len].nxt = fir[x];
        fir[x] = len;
        return;
    }
} tree, ask;
unsigned f[10000100];
__inline unsigned find(unsigned x) {
    while (x ^ f[x]) x = f[x] = f[f[x]];
    return x;
}
short vis[10001000];
unsigned ans[10000100];
void tarjan(const unsigned u) {
    vis[u] = 1;
    for (unsigned i = tree.fir[u]; i; i = tree.v[i].nxt) {
        if (vis[tree.v[i].to])
            continue;
        tarjan(tree.v[i].to);
        f[find(tree.v[i].to)] = find(u);
    }
    for (unsigned i = ask.fir[u]; i; i = ask.v[i].nxt) {
        if (!(vis[ask.v[i].to] ^ 2))
            ans[ask.v[i].id] = find(ask.v[i].to);
    }
    vis[u] = 2;
    return;
}
signed main() {
    //	freopen("1.txt","r",stdin);
    R(n);
    R(q);
    R(r);
    for (unsigned i = 1, u, v; i ^ n; ++i) {
        f[i] = i;
        R(u);
        R(v);
        tree.add(u, v);
        tree.add(v, u);
    }
    f[n] = n;
    for (unsigned i = 1, u, v; i <= q; ++i) {
        R(u);
        R(v);
        ask.add(u, v, i);
        ask.add(v, u, i);
    }
    tarjan(r);
    for (unsigned i = 1; i <= q; ++i) {
        write(ans[i]);
        if (pp - pbuf == 32768)
            fwrite(pbuf, 1, pp - pbuf, stdout), pp = pbuf;
        *pp++ = '\n';
    }
    fwrite(pbuf, 1, pp - pbuf, stdout);
    return 0;
}
2023/9/11 13:04
加载中...