QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#422393#5956. Paradox Sorthelhy32 ✓438ms3820kbC++143.4kb2024-05-27 13:36:522024-05-27 13:36:53

Judging History

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

  • [2024-05-27 13:36:53]
  • 评测
  • 测评结果:32
  • 用时:438ms
  • 内存:3820kb
  • [2024-05-27 13:36:52]
  • 提交

answer

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;
const int N = 105;

int n, A;

bitset<N> out[N], in[N], vis;

void bfs(int S, bitset<N> g[N])
{
    queue<int> q;
    q.push(S);
    vis[S] = true;
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        for (int i = 0; i < n; i++)
        {
            if (g[u][i] && !vis[i])
            {
                vis[i] = true;
                q.push(i);
            }
        }
    }
}

int ans[N];
bool solve()
{
    bitset<N> now, tmp;
    int last = -1;
    for (int i = 0; i < n; i++)
    {
        bool suc = false;
        for (int u = 0; u < n; u++)
        {
            if (now[u]) continue;

            if (~last && !out[last][u])
            {
                if (u == A) continue;
                now[u] = true;

                vis = now;
                bfs(last, out);
                tmp = vis;

                vis = now;
                bfs(A, in);
                tmp = (tmp & vis) & ~now;

                tmp[last] = true;

                bool flag = true;
                for (int v = 0; v < n; v++)
                {
                    if (tmp[v] || now[v]) continue;
                    if (!out[v][last])
                    {
                        now[u] = flag = false;
                        break;
                    }
                }

                if (flag)
                {
                    ans[i] = u;
                    suc = true;
                    break;
                }
            }
            else
            {
                if (u != A)
                {
                    vis = now;
                    vis[u] = true;
                    bfs(u, out);
                    tmp = vis;

                    vis = now;
                    vis[u] = true;
                    bfs(A, in);
                    tmp = (tmp & vis) & ~now;
                }
                else
                {
                    tmp.reset();
                    tmp[A] = true;
                }

                bool flag = true;
                for (int v = 0; v < n; v++)
                {
                    if (tmp[v] || now[v]) continue;
                    if (!out[v][u])
                    {
                        now[u] = flag = false;
                        break;
                    }
                }

                if (flag)
                {
                    now[u] = suc = true;
                    ans[i] = last = u;
                    break;
                }
            }
        }
        if (!suc)
            return false;
    }
    return true;
}

int main()
{
    int T;
    cin >> T;
    for (int t = 1; t <= T; t++)
    {
        cin >> n >> A;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                char c;
                scanf(" %c", &c);
                in[i][j] = (c == 'Y');
                out[i][j] = (c == 'N');
            }
        }
        printf("Case #%d:", t);
        if (!solve())
        {
            printf(" IMPOSSIBLE\n");
        }
        else
        {
            for (int i = 0; i < n; i++)
            {
                printf(" %d", ans[i]);
            }
            putchar('\n');
        }
    }
    return 0;
}

詳細信息

Subtask #1:

score: 4
Accepted

Test #1:

score: 4
Accepted
time: 1ms
memory: 3820kb

input:

100
3 0
-YN
N-Y
YN-
2 0
-Y
N-
5 0
-YNNN
N-YNN
YN-YN
YYN-Y
YYYN-
5 1
-NYYY
Y-NNN
NY-NY
NYY-N
NYNY-
6 5
-YYNNY
N-YYNY
NN-NYN
YNY-NY
YYNY-Y
NNYNN-
4 0
-YYY
N-YN
NN-N
NYY-
2 0
-Y
N-
5 1
-NYNY
Y-YYY
NN-YY
YNN-N
NNNY-
7 5
-YYYYYY
N-NNYYN
NY-YNNN
NYN-NYN
NNYY-NN
NNYNY-N
NYYYYY-
8 0
-YNNNNNN
N-YNNNNN
YN-YNN...

output:

Case #1: 1 2 0
Case #2: 0 1
Case #3: 3 4 2 1 0
Case #4: 0 2 3 4 1
Case #5: 0 1 3 4 2 5
Case #6: 0 1 2 3
Case #7: 0 1
Case #8: 0 1 2 3 4
Case #9: IMPOSSIBLE
Case #10: 6 7 5 4 3 2 1 0
Case #11: 0 1 2
Case #12: 0 1
Case #13: 0 1
Case #14: IMPOSSIBLE
Case #15: IMPOSSIBLE
Case #16: 7 8 6 5 4 3 1 2 0
Case...

result:

ok 100 lines

Subtask #2:

score: 28
Accepted

Test #2:

score: 28
Accepted
time: 438ms
memory: 3820kb

input:

100
39 0
-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
N-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYYYN-YNN...

output:

Case #1: 37 38 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Case #2: 0 13 23 28 30 34 38 40 41 42 43 46 49 51 52 33 5 1 17 32 15 29 19 10 16 47 48 9 4 27 6 7 18 31 8 11 26 50 3 37 25 35 45 20 24 39 22 12 44 36 2 21 14
Case #3: 0 1 2 3 4 5 6 8 9...

result:

ok 100 lines

Extra Test:

score: 0
Extra Test Passed