关于本题的第一个测试点
查看原帖
关于本题的第一个测试点
437035
wfjfjx楼主2024/1/21 19:01

在我写完这道题后得到了 95 分,发现只有第一个测试点的第 774 行出错了,我的代码输出 ymqOAO(连通),但数据输出 Bob(不连通)。我用的是随机化算法,理论上来说是不可能把不连通判成连通的,所以我写了如下代码(对第 774 组数据用并查集暴力判断),发现依旧输出 ymqOAO,并且好多交过这题的人都是这一组数据错了并且都还没有通过,所以怀疑是不是数据有问题,如果代码有问题希望大家能帮忙指出,谢谢!(违规紫杉)

#include <bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N = 1e6 + 3;

mt19937_64 rnd(chrono :: steady_clock :: now().time_since_epoch().count());
inline int read() {
    char ch = getchar(); int x = 0;
    while (!isdigit(ch)) {ch = getchar();}
    while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();}
    return x;
}

struct node {
    int id, x, y;
}e[N], E[N];
int n, m, T, fa[N];
ll val[N], v[N];
vector< pair<int, int> > g[N];
vector<int> vec;
bitset<N> vis;

inline int getfa(int x) {return x == fa[x] ? x : fa[x] = getfa(fa[x]);}

void dfs(int x, int pa) {
    for (auto tmp : g[x]) {
        int y = tmp.first;
        if (y == pa) continue;
        dfs(y, x);
        v[x] ^= v[y];
        val[tmp.second] = v[y];
    }
}

int main() {
    n = read(); m = read();
    for (int i = 1; i <= n; ++i) fa[i] = i;
    for (int i = 1; i <= m; ++i) e[i].id = i, e[i].x = read(), e[i].y = read(), E[i] = e[i];
    shuffle(e + 1, e + 1 + m, rnd);//这里随机是试验一下会不会是重边之类的导致出错,打算换个生成树(虽然感觉重边自环对我的代码的正确性没有影响)
    for (int i = 1, x, y; i <= m; ++i) {
        x = getfa(e[i].x); y = getfa(e[i].y);
        if (x == y) val[e[i].id] = rnd();
        else {
            g[e[i].x].push_back(make_pair(e[i].y, e[i].id));
            g[e[i].y].push_back(make_pair(e[i].x, e[i].id));
            e[i].x = e[i].y = 0;
            fa[y] = x;
        }
    }
    for (int i = 1, x, y; i <= m; ++i) {
        x = e[i].x; y = e[i].y;
        if (x == 0) continue;
        v[x] ^= val[e[i].id]; v[y] ^= val[e[i].id];
    }
    dfs(1, 1);
    T = read();
    int c, x, pd; ll res;
    for (int qwq = 1; qwq <= T; ++qwq) {
        if (qwq == 774) {
            c = read();
            for (int i = 1; i <= c; ++i) x = read(), vis[x] = 1;
            puts("Bob"); continue;
            for (int i = 1; i <= n; ++i) fa[i] = i;
            for (int i = 1, x, y; i <= m; ++i) {
                if (vis[i]) continue;
                x = getfa(E[i].x); y = getfa(E[i].y);
                if (x == y) continue;
                fa[x] = y;
            }
            pd = true;
            for (int i = 1; i <= n; ++i) pd &= (getfa(i) == getfa(1));
            puts(pd ? "ymqOAO" : "Bob");
            continue;
        }
        c = read(); pd = true;
        for (int i = 1; i <= c; ++i) {
            x = read();
            vec.push_back(x);
        }
        for (int i = 1; i < (1 << c); ++i) {
            res = 0;
            for (int j = 0; j < c; ++j)
                if ((i >> j) & 1) res ^= val[vec[j]];
            if (res == 0) pd = false;
        }
        puts(pd ? "ymqOAO" : "Bob");
        vec.clear();
    }
    return 0;
}
2024/1/21 19:01
加载中...