답안 #241958

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
241958 2020-06-26T12:31:09 Z VEGAnn Zagonetka (COI18_zagonetka) C++14
0 / 100
54 ms 384 KB
#include <bits/stdc++.h>
#define PB push_back
#define sz(x) ((int)x.size())
using namespace std;
const int N = 110;
vector<int> g[N], gr[N];
priority_queue<int, vector<int>, greater<int> > pq;
priority_queue<int> PQ;
int per[N], qur[N], mrk[N], in[N], n, loc[N];
bool was;

void dfs(int v){
    if (was) return;

    mrk[v] = 1;

    for (int u : g[v]){
        if (was) return;

        if (mrk[u] == 0)
            dfs(u); else
        if (mrk[u] == 1){
            was = 1;
            return;
        }
    }

    mrk[v] = 2;
}

void prit(){
    for (int i = 1; i <= n; i++){
        cout << qur[i];

        if (i == n)
            cout << endl;
        else cout << " ";
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef _LOCAL
//    freopen("in.txt","r",stdin);
#endif // _LOCAL

    cin >> n;

    for (int i = 1; i <= n; i++) {
        cin >> per[i];
        loc[per[i]] = i;
    }

    for (int vl = 2; vl <= n; vl++)
    for (int pr = vl - 1; pr > 0; pr--){
        gr[loc[pr]].PB(loc[vl]);
        g[loc[vl]].PB(loc[pr]);

        for (int i = 1; i <= n; i++) {
            qur[i] = per[i];
            mrk[i] = 0;
        }

        was = 0;

        dfs(vl);

        if (was){
            gr[loc[pr]].pop_back();
            g[loc[vl]].pop_back();
            continue;
        }

        for (int i = pr; i <= vl; i++){
            in[loc[i]] = sz(gr[loc[i]]);

            if (in[loc[i]] == 0)
                pq.push(loc[i]);
        }

        int cur = pr;

        while (sz(pq) > 0){
            int v = pq.top(); pq.pop();

            qur[v] = cur++;

            for (int u : g[v]){
                in[u]--;

                if (in[u] == 0)
                    pq.push(u);
            }
        }

        cout << "query";

        for (int i = 1; i <= n; i++)
            cout << " " << qur[i];

        cout << endl;

        int res; cin >> res;

        gr[loc[pr]].pop_back();
        g[loc[vl]].pop_back();

        if (res == 0){
            g[loc[pr]].PB(loc[vl]);
            gr[loc[vl]].PB(loc[pr]);
        }

        // delete fictive edges
    }

    cout << "end" << endl;

    for (int i = 1; i <= n; i++){
        in[i] = sz(gr[i]);

        if (in[i] == 0)
            pq.push(i);
    }

    int cur = 1;

    while (sz(pq) > 0){
        int v = pq.top(); pq.pop();

        qur[v] = cur++;

        for (int u : g[v]){
            in[u]--;

            if (in[u] == 0)
                pq.push(u);
        }
    }

    prit();

    for (int i = 1; i <= n; i++){
        in[i] = sz(gr[i]);

        if (in[i] == 0)
            PQ.push(i);
    }

    cur = 1;

    while (sz(PQ) > 0){
        int v = PQ.top(); PQ.pop();

        qur[v] = cur++;

        for (int u : g[v]){
            in[u]--;

            if (in[u] == 0)
                PQ.push(u);
        }
    }

    prit();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Incorrect 5 ms 384 KB not a permutation
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 14 ms 384 KB not a permutation
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB not a permutation
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 54 ms 384 KB not a permutation
2 Halted 0 ms 0 KB -