제출 #1222772

#제출 시각아이디문제언어결과실행 시간메모리
1222772thinknoexitZagonetka (COI18_zagonetka)C++20
9 / 100
24 ms440 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 111;
int n;
int p[N], p2[N], pos[N];
vector<int> adj[N], adj2[N];
int deg[N], deg1[N], deg2[N];
int res[N];
bool vis[N];
int ask(int i, int j) {
    // find topological order
    adj2[j].push_back(i);
    for (int k = 1;k <= n;k++) p2[k] = p[k];
    for (int k = i;k <= j;k++) {
        for (auto& x : adj2[k]) {
            if (x <= j) deg[x]++;
        }
    }
    queue<int> q;
    for (int k = i;k <= j;k++) {
        if (deg[k] == 0) q.push(k);
    }
    for (int k = i;k <= j;k++) {
        int v = q.front();
        p2[pos[v]] = k;
        q.pop();
        for (auto& x : adj2[v]) {
            if (x <= j && --deg[x] == 0) {
                q.push(x);
            }
        }
    }
    adj2[j].pop_back();
    cout << "query";
    for (int k = 1;k <= n;k++) cout << ' ' << p2[k];
    cout << endl;
    int x;
    cin >> x;
    return x;
}
void dfs(int v) {
    vis[v] = 1;
    for (auto& x : adj2[v]) if (!vis[x]) dfs(x);
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n;
    for (int i = 1;i <= n;i++) {
        cin >> p[i];
        pos[p[i]] = i;
    }
    for (int k = 1;k < n;k++) {
        for (int i = 1;i <= n - k;i++) {
            memset(vis, 0, sizeof vis);
            dfs(i);
            if (vis[i + k]) continue;
            if (!ask(i, i + k)) {
                adj2[i].push_back(i + k);
            }
        }
    }
    cout << "end" << endl;
    for (int i = 1;i <= n;i++) {
        for (auto& x : adj2[i]) {
            adj[pos[i]].push_back(pos[x]);
            deg1[pos[x]]++;
            deg2[pos[x]]++;
        }
    }
    // calculate answer
    {
        priority_queue<int, vector<int>, greater<int>> pq; // largest
        for (int i = 1;i <= n;i++) {
            if (deg1[i] == 0) pq.push(i);
        }
        for (int i = 1;i <= n;i++) {
            int v = pq.top();
            pq.pop();
            res[v] = i;
            for (auto& x : adj[v]) {
                if (--deg1[x] == 0) {
                    pq.push(x);
                }
            }
        }
        for (int i = 1;i <= n;i++) {
            cout << res[i] << ' ';
        }
        cout << endl;
    }
    {
        priority_queue<int> pq; // largest
        for (int i = 1;i <= n;i++) {
            if (deg2[i] == 0) pq.push(i);
        }
        for (int i = 1;i <= n;i++) {
            int v = pq.top();
            pq.pop();
            res[v] = i;
            for (auto& x : adj[v]) {
                if (--deg2[x] == 0) {
                    pq.push(x);
                }
            }
        }
        for (int i = 1;i <= n;i++) {
            cout << res[i] << ' ';
        }
        cout << endl;
    }

    return 0;
}
/*
4
3 2 1 4
6
1 2 3 4 5 6
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...