제출 #640864

#제출 시각아이디문제언어결과실행 시간메모리
640864anhduc2701Zagonetka (COI18_zagonetka)C++17
100 / 100
125 ms472 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;
using pi = pair<ll, ll>;
using vi = vector<ll>;
using pii = pair<pair<ll, ll>, ll>;
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define eb emplace_back
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
int n;
int pos[105];
int a[105];
int ray[105];
int ok[105][105];
int den[105];
int mang[105];
vector<int> G[105];
void print()
{
    for (int i = 1; i <= n; i++)
    {
        ray[i] = i;
        den[i] = 0;
        G[i].clear();
    }
    priority_queue<int> pq;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            if (ok[i][j])
            {
                G[pos[j]].push_back(pos[i]);
                den[pos[i]]++;
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (den[i] == 0)
        {
            pq.push(i);
        }
    }
    int luot = n + 1;
    while (pq.size())
    {
        int z = pq.top();
        pq.pop();
        mang[z] = --luot;
        for (auto v : G[z])
        {
            den[v]--;
            if (!den[v])
                pq.push(v);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        cout << mang[i] << ' ';
    }
    cout << endl;
}
void print2()
{
    for (int i = 1; i <= n; i++)
    {
        ray[i] = i;
        den[i] = 0;
        G[i].clear();
    }
    priority_queue<int> pq;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            if (ok[i][j])
            {
                G[pos[i]].push_back(pos[j]);
                den[pos[j]]++;
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (den[i] == 0)
        {
            pq.push(i);
        }
    }
    int luot = 0;
    while (pq.size())
    {
        int z = pq.top();
        pq.pop();
        mang[z] = ++luot;
        for (auto v : G[z])
        {
            den[v]--;
            if (!den[v])
                pq.push(v);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        cout << mang[i] << ' ';
    }
}
signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        pos[a[i]] = i;
    }
    for (int len = 1; len <= n; len++)
    {
        for (int l = 1; l <= n - len; l++)
        {
            int r = l + len;
            for (int i = 1; i <= n; i++)
            {
                ray[i] = i;
                den[i] = 0;
                G[i].clear();
            }
            for (int i = l; i <= r; i++)
            {
                ray[i] = 0;
            }
            for (int i = l; i <= r; i++)
            {
                for (int j = i + 1; j <= r; j++)
                {
                    if (ok[i][j])
                    {
                        G[j].push_back(i);
                        den[i]++;
                    }
                }
            }
            G[l].push_back(r);
            den[r]++;
            queue<int> topo;
            int luot = r + 1;
            for (int i = l; i <= r; i++)
            {
                if (!den[i])topo.push(i);
            }
            while (topo.size())
            {
                int z = topo.front();
                topo.pop();
                ray[z] = --luot;
                for (auto v : G[z])
                {
                    den[v]--;
                    if (!den[v])
                        topo.push(v);
                }
            }
            int check = 0;
            for (int i = 1; i <= n; i++)
            {
                if (!ray[i])
                    check = 1;
            }
            if (check == 1)
            {
                ok[l][r] = 1;
                continue;
            }
            for (int i = 1; i <= n; i++)
            {
                mang[pos[i]] = ray[i];
            }
            cout << "query ";
            for (int i = 1; i <= n; i++)
            {
                cout << mang[i] << ' ';
            }
            cout << endl;
            int x;
            cin >> x;
            if (!x)
                ok[l][r] = 1;
        }
    }
    cout << "end " << endl;
    print();
    print2();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...