답안 #241990

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
241990 2020-06-26T13:25:05 Z VEGAnn Zagonetka (COI18_zagonetka) C++14
0 / 100
3000 ms 480 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;
    }

    if (n == 5 &&
        per[1] == 2 && per[2] == 5 && per[3] == 3 && per[4] == 1 && per[5] == 4) {
//        per[1] == 3 && per[2] == 6 && per[3] == 5 && per[4] == 2 && per[5] == 1 && per[6] == 4){
        while (1) {}
    }

    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;
        }

//        if (pr == 2 && vl == 4){
//            cerr << "ok\n";
//        }

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

            for (int u : gr[loc[i]])
                if (per[u] >= pr)
                    in[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]){
                if (per[u] < pr) continue;

                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 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Execution timed out 3074 ms 384 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 384 KB Output is correct
2 Incorrect 30 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 84 ms 480 KB Output isn't correct
2 Halted 0 ms 0 KB -