Submission #724964

#TimeUsernameProblemLanguageResultExecution timeMemory
724964lukadupliZagonetka (COI18_zagonetka)C++14
18 / 100
358 ms560 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 105; int n, arr[MAXN]; int maybe[MAXN][MAXN], sure[MAXN][MAXN]; int mini[MAXN], maxi[MAXN]; bool query(int* perm, int len){ cout << "query "; for(int i = 0; i < len; i++) cout << perm[i] << ' '; cout << endl; bool ans; cin >> ans; return ans; } bool bio[MAXN]; vector<int> topsort; void dfs(int node){ bio[node] = 1; for(int i = 0; i < n; i++){ if(!bio[i] && (maybe[node][i] || sure[node][i])) dfs(i); } topsort.push_back(node); } vector<pair<int, int>> edgesort; void edfs(int node){ bio[node] = 1; for(int i = 0; i < n; i++){ if(maybe[node][i] || sure[node][i]){ if(!bio[i]) edfs(i); } } for(int i = 0; i < n; i++){ if(maybe[i][node]) edgesort.push_back({i, node}); } } void gentopsort(){ memset(bio, 0, sizeof bio); topsort.clear(); for(int i = 0; i < n; i++) if(!bio[i]) dfs(i); reverse(topsort.begin(), topsort.end()); } void genedgesort(){ memset(bio, 0, sizeof bio); edgesort.clear(); for(int i = 0; i < n; i++) if(!bio[i]) edfs(i); reverse(edgesort.begin(), edgesort.end()); } int perm[MAXN]; void genperm(){ gentopsort(); for(int i = 0; i < n; i++) perm[topsort[i]] = i + 1; } void solve_edge(){ genedgesort(); int a = edgesort[0].first; int b = edgesort[0].second; maybe[a][b] = 0; maybe[b][a] = 1; genperm(); if(!query(perm, n)){ sure[a][b] = 1; } maybe[b][a] = 0; } void gen_small(const vector<int>& v, int a, int b){ if(v.empty()) return; vector<int> sub, nsub; int small = v[0]; for(int e : v){ if(e == small) continue; if(sure[small][e] == -1) sub.push_back(e); else nsub.push_back(e); } mini[small] = a + sub.size(); gen_small(sub, a, a + sub.size() - 1); gen_small(nsub, a + sub.size() + 1, b); } void gen_big(const vector<int>& v, int a, int b){ if(v.empty()) return; vector<int> sub, nsub; int small = v[0]; for(int e : v){ if(e == small) continue; if(sure[small][e] == 1) sub.push_back(e); else nsub.push_back(e); } maxi[small] = b - sub.size(); gen_big(sub, b - sub.size() + 1, b); gen_big(nsub, a, b - sub.size() - 1); } int last; void dfs1(int node){ for(int nxt = 0; nxt < n; nxt++){ if(sure[node][nxt] == -1 && !mini[nxt]) dfs1(nxt); } mini[node] = ++last; } void dfs2(int node){ for(int nxt = 0; nxt < n; nxt++){ if(sure[node][nxt] == 1 && !maxi[nxt]) dfs2(nxt); } maxi[node] = --last; } int main() { cin >> n; for(int i = 0; i < n; i++) cin >> arr[i]; for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ if(arr[i] < arr[j]) maybe[i][j] = 1; else maybe[j][i] = 1; } } for(int i = 0; i < n * (n - 1) / 2; i++) solve_edge(); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++) if(sure[i][j] == 1) sure[j][i] = -1; } /*last = 0; for(int i = 0; i < n; i++){ if(!mini[i]) dfs1(i); } last = n + 1; for(int i = 0; i < n; i++){ if(!maxi[i]) dfs2(i); }*/ vector<int> v; for(int i = 0; i < n; i++) v.push_back(i); gen_small(v, 1, n); gen_big(v, 1, n); cout << "end\n"; for(int i = 0; i < n; i++) cout << mini[i] << ' '; cout << '\n'; for(int i = 0; i < n; i++) cout << maxi[i] << ' '; cout << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...