Submission #749270

#TimeUsernameProblemLanguageResultExecution timeMemory
749270Username4132Zagonetka (COI18_zagonetka)C++14
100 / 100
100 ms416 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define forn(i, n) for(int i=0; i<(int)n; ++i)
#define forsn(i, s, n) for(int i=s; i<(int)n; ++i)
#define dforn(i, n) for(int i=n-1; i>=0; --i)
#define PB push_back

const int MAXN=110;
int n, reply;
bool vis[MAXN], blocked[MAXN];
vector<int> arr, rev, g[MAXN], net[MAXN], net_rev[MAXN], ord, reach;

vector<int> inv(vector<int>& per){
    vector<int> ret(per.size());
    forn(i, per.size()) ret[per[i]]=i;
    return ret;
}

void dfs(int v){
    vis[v]=true;
    for(int to:g[v]) if(!vis[to]) dfs(to);
    ord.PB(v);
}

void dfs2(int v, vector<int>* gr){
    blocked[v]=true;
    for(int to:gr[v]) if(!blocked[to]) dfs2(to, gr);
    reach.PB(v);
}

vector<int> opt(vector<int> v, vector<int>* gr){
    if(v.size()<=1) return v;
    auto itr = min_element(v.begin(), v.end());
    forn(i, n) blocked[i]=true;
    for(auto el:v) blocked[el]=false;
    reach.clear();
    dfs2(*itr, gr);
    for(int el:v) blocked[el]=false;
    for(int re:reach) blocked[re]=true;
    vector<int> l, r;
    for(int el:v){
        if(el==*itr) continue;
        if(blocked[el]) r.PB(el);
        else l.PB(el);
    }
    vector<int> lv = opt(l, gr);
    vector<int> rv = opt(r, gr);
    lv.PB(*itr);
    lv.insert(lv.end(), rv.begin(), rv.end());
    return lv;
}

int main(){
    scanf("%d", &n);
    arr.resize(n);
    forn(i, n) scanf("%d", &arr[i]), --arr[i];
    rev = inv(arr);
    dforn(i, n){
        forsn(j, i+1, n) g[i].PB(j);
        forsn(j, i+1, n){
            g[i].erase(find(g[i].begin(), g[i].end(), j));
            forsn(k, i, n) vis[k]=false;
            forsn(k, i, n) if(!vis[k]) dfs(k);
            reverse(ord.begin(), ord.end());
            vector<int> cr(n);
            forn(k, n) cr[k]=rev[k<i? k : ord[k-i]];
            vector<int> ask = inv(cr);
            printf("query");
            forn(k, n) printf(" %d", ask[k]+1);
            printf("\n");
            fflush(stdout);
            scanf("%d", &reply);
            if(!reply) g[i].PB(j);
            ord.clear();
        }
    }

    vector<int> alln;
    forn(i, n) alln.PB(i);
    forn(v, n) for(int to:g[v]) net[rev[v]].PB(rev[to]), net_rev[rev[to]].PB(rev[v]);

    vector<int> ans1 = opt(alln, net_rev);
    reverse(ans1.begin(), ans1.end());
    vector<int> ans2 = opt(alln, net);
    vector<int> ret1 = inv(ans1), ret2 = inv(ans2);
    printf("end\n");
    forn(i, n) printf("%d ", ret1[i]+1);
    printf("\n");
    forn(i, n) printf("%d ", ret2[i]+1);
    printf("\n");
    fflush(stdout);
}

Compilation message (stderr)

zagonetka.cpp: In function 'int main()':
zagonetka.cpp:56:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
zagonetka.cpp:58:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |     forn(i, n) scanf("%d", &arr[i]), --arr[i];
      |                ~~~~~^~~~~~~~~~~~~~~
zagonetka.cpp:74:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |             scanf("%d", &reply);
      |             ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...