Submission #44568

# Submission time Handle Problem Language Result Execution time Memory
44568 2018-04-03T10:19:42 Z ssnsarang2023 Zagonetka (COI18_zagonetka) C++17
0 / 100
2 ms 436 KB
#define debug

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> ii;

#define SZ(x) ((int)x.size())

int n, a[105], b[105], pos[105], deg[105], topo[105], n_topo;
bool adj[105][105];

bool ask() {
    queue<int> q;
    fill(deg + 1, deg + n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (adj[i][j]) {
                ++deg[j];
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (!deg[i]) {
            q.push(i);
        }
    }
    n_topo = 0;
    while (SZ(q)) {
        int u = q.front(); q.pop();
        topo[++n_topo] = u;
        for (int v = 1; v <= n; ++v) {
            if (!adj[u][v]) continue;
            --deg[v];
            if (!deg[v]) {
                q.push(v);
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (deg[i]) {
            return 0;
        }
        b[topo[i]] = i;
    }
    printf("query ");
    for (int i = 1; i <= n; ++i) {
        printf("%d", b[i]);
        if (i < n) {
            printf(" ");
        }
    }
    fflush(stdout);
    int re = 0;
    scanf("%d", &re);
    return re;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        pos[a[i]] = i;
        for (int j = 1; j < i; ++j) {
            bool re = a[j] < a[i];
            if (re) {
                adj[j][i] = 1;
            } else {
                adj[i][j] = 1;
            }
        }
    }
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j <= n - i; ++j) {
            int x = pos[j], y = pos[j + i];
            adj[x][y] = 0, adj[y][x] = 1;
            bool re = ask();
            adj[y][x] = 0, adj[x][y] = !re;
        }
    }
    set<int> q;
    fill(deg + 1, deg + n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (adj[i][j]) {
                ++deg[j];
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (!deg[i]) {
            q.insert(i);
        }
    }
    int idx = 1;
    while (SZ(q)) {
        int u = *q.begin();
        q.erase(q.begin());
        a[u] = idx++;
        for (int v = 1; v <= n; ++v) {
            if (!adj[u][v]) continue;
            --deg[v];
            if (!deg[v]) {
                q.insert(v);
            }
        }
    }
    fill(deg + 1, deg + n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            swap(adj[i][j], adj[j][i]);
        }
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (adj[i][j]) {
                ++deg[j];
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (!deg[i]) {
            q.insert(i);
        }
    }
    idx = n;
    while (SZ(q)) {
        int u = *q.begin();
        q.erase(q.begin());
        b[u] = idx--;
        for (int v = 1; v <= n; ++v) {
            if (!adj[u][v]) continue;
            --deg[v];
            if (!deg[v]) {
                q.insert(v);
            }
        }
    }
    printf("end\n");
    for (int i = 1; i <= n; ++i) {
        printf("%d", a[i]);
        if (i < n) {
            printf(" ");
        }
    }
    printf("\n");
    for (int i = 1; i <= n; ++i) {
        printf("%d", b[i]);
        if (i < n) {
            printf(" ");
        }
    }
    fflush(stdout);
    return 0;
}

Compilation message

zagonetka.cpp: In function 'bool ask()':
zagonetka.cpp:57:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &re);
     ~~~~~^~~~~~~~~~~
zagonetka.cpp: In function 'int main()':
zagonetka.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
zagonetka.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &a[i]);
         ~~~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Execution timed out 2 ms 248 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2 ms 436 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2 ms 436 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2 ms 436 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -