QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#660567#7900. Gifts from Knowledgefoolnine#WA 15ms3780kbC++204.7kb2024-10-20 12:07:172024-10-20 12:07:18

Judging History

你现在查看的是最新测评结果

  • [2024-10-20 12:07:18]
  • 评测
  • 测评结果:WA
  • 用时:15ms
  • 内存:3780kb
  • [2024-10-20 12:07:17]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

using i64 = long long;
const int mod = 1e9 + 7;

struct TwoSat {
    int n;
    vector<vector<int>> e;
    vector<bool> ans;

    TwoSat(int n) : n(n), e(2 * n), ans(n) {}

    // u为true,或者v为true
    //     u(false)->v(true)
    //     v(false)->u(true)
    void addedge(int u, bool a, int v, bool b) {
        e[2 * u + !a].push_back(2 * v + b);
        e[2 * v + !b].push_back(2 * u + a);

        e[2 * v + b].push_back(2 * u + !a);
        e[2 * u + a].push_back(2 * v + !b);
    }

    bool satisfible() {
        int dfncnt = 0, cnt = 0;
        vector<int> dfn(2 * n), low(2 * n), id(2 * n);
        stack<int> stk;
        auto tarjan = [&](auto self, int u) -> void {
            stk.push(u);
            dfn[u] = low[u] = ++dfncnt;
            for (auto v : e[u]) {
                if (dfn[v] == 0) {
                    self(self, v);
                    low[u] = min(low[u], low[v]);
                } else if (id[v] == 0) {
                    low[u] = min(low[u], dfn[v]);
                }
            }
            if (dfn[u] == low[u]) {
                ++cnt;
                int v;
                do {
                    v = stk.top();
                    stk.pop();
                    id[v] = cnt;
                } while (v != u);
            }
        };
        for (int i = 0; i < 2 * n; i++) {
            if (dfn[i] == 0) {
                tarjan(tarjan, i);
            }
        }
        for (int i = 0; i < n; i++) {
            if (id[2 * i] == id[2 * i | 1]) {
                return false;
            }
            ans[i] = id[2 * i] > id[2 * i | 1];
        }
        return true;
    }

    vector<bool> answer() {
        return ans;
    }
};

struct DSU {
    vector<int> f, siz;

    DSU() {}
    DSU(int n) {
        init(n);
    }

    void init(int n) {
        f.resize(n);
        iota(f.begin(), f.end(), 0);
        siz.assign(n, 1);
    }

    int find(int x) {
        while (f[x] != x) {
            x = f[x] = f[f[x]];
        }
        return x;
    }

    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }

    int size(int x) {
        return siz[find(x)];
    }

    bool same(int x, int y) {
        return find(x) == find(y);
    }
};

void solve() {
    int n, m, cal = 0;
    cin >> n >> m;

    vector<vector<int>> pos(m + 1);
    vector<vector<int>> a(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;

        for (int j = 1; j <= m; j++) {
            a[i][j] = (s[j - 1] == '1');
            if (a[i][j] == 1) {
                pos[j].push_back(i);
                cal++;
            }
        }
    }

    if (cal > m) {
        cout << 0 << "\n";
        return;
    }

    int ok = 1;

    TwoSat ts(n);
    for (int i = 1; i <= m / 2; i++) {
        int j = m - i + 1;
        if (pos[i].size() + pos[j].size() > 2) {
            ok = 0;
            break;
        }

        for (int ii = 0; ii < pos[i].size(); ii++) {
            for (int jj = ii + 1; jj < pos[i].size(); jj++) {
                ts.addedge(pos[i][ii] - 1, 1, pos[i][jj] - 1, 1);
            }
        }

        for (int ii = 0; ii < pos[j].size(); ii++) {
            for (int jj = ii + 1; jj < pos[j].size(); jj++) {
                ts.addedge(pos[j][ii] - 1, 1, pos[j][jj] - 1, 1);
            }
        }

        for (int ii = 0; ii < pos[i].size(); ii++) {
            for (int jj = 0; jj < pos[j].size(); jj++) {
                ts.addedge(pos[i][ii] - 1, 1, pos[j][jj] - 1, 0);
            }
        }
    }

    if (m % 2 == 1 && pos[m / 2 + 1].size() > 1) {
        ok = 0;
    }

    if (!ok) {
        cout << 0 << endl;
        return;
    }

    DSU dsu(n);
    for (int i = 1; i <= m / 2; i++) {
        int j = m - i + 1;

        for (int ii = 0; ii < pos[i].size(); ii++) {
            dsu.merge(pos[i][0] - 1, pos[i][ii] - 1);
        }

        for (int ii = 0; ii < pos[j].size(); ii++) {
            dsu.merge(pos[j][0] - 1, pos[j][ii] - 1);
        }

        if (pos[i].size() > 0 && pos[j].size() > 0) {
            dsu.merge(pos[i][0] - 1, pos[j][0] - 1);
        }
    }

    int ans = 1;
    for (int i = 0; i < n; i++) {
        if (dsu.find(i) == i) {
            ans = (ans * 2) % mod;
        }
    }
    cout << ans << endl;
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3468kb

input:

3
3 5
01100
10001
00010
2 1
1
1
2 3
001
001

output:

4
0
2

result:

ok 3 number(s): "4 0 2"

Test #2:

score: 0
Accepted
time: 15ms
memory: 3780kb

input:

15613
10 10
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
15 8
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
1 5
00000
5 9
000000000
000000000
0000...

output:

1024
32768
2
32
32768
128
32
16
16
2
16384
16384
128
128
32768
8192
128
64
16384
2
4
2
4096
16
4096
1024
32768
32768
16384
8
128
2
16
4096
8192
32768
8192
8192
16
16384
16384
256
128
8
256
8
4096
512
2
4
32
32
2
64
512
1024
32768
32768
2
64
16384
16
8192
16
256
16
64
8192
8192
64
1024
2
32768
2
4
51...

result:

ok 15613 numbers

Test #3:

score: -100
Wrong Answer
time: 12ms
memory: 3756kb

input:

15759
9 6
000000
000000
000000
000000
000000
000000
000000
000000
000000
5 15
010000000000000
000000000000000
000000000000000
000100000000000
000100000000000
14 12
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000...

output:

512
16
16384
512
1024
4096
32768
4
2
512
512
512
512
8
2
256
16
4096
512
64
16
4096
512
32
32768
8192
32
2048
128
16
4096
64
32768
256
32
16384
8
512
32
2048
8
16
1024
2048
128
64
32
8
512
8
8192
256
8192
32768
2
8
512
512
256
32
2
2048
8192
8
64
8
2
16384
32768
32768
1024
4096
16384
16384
128
256
4...

result:

wrong answer 2380th numbers differ - expected: '0', found: '4'