This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, a[N], m, deg[N], mn[N], mx[N], Deg[N], order[N];
vector<int> g[N];
vector<int> toposort() {
vector<int> d(n + 1);
for(int i = 1; i <= n; i++) {
for(auto u : g[i]) {
d[u]++;
}
}
queue<int> q;
for(int i = 1; i <= n; i++) if(!d[i]) q.push(i);
vector<int> ret(n + 1);
int cnt = 0;
while(!q.empty()) {
int v = q.front(); q.pop();
ret[v] = ++cnt;
for(auto u : g[v]) {
d[u]--;
if(d[u] == 0) {
q.push(u);
}
}
}
return ret;
}
bool ask(int l, int r)
{
cout << "query ";
// swap(a[order[l]], a[order[r]]);
// for(int i = 1; i <= n; i++) cout << a[i] << " ";
// swap(a[order[l]], a[order[r]]);
auto v = toposort();
for(int i = 1; i <= n; i++) cout << v[i] << " ";
cout << endl;
int x;
cin >> x;
return x;
}
int main()
{
cin.tie(0); ios_base::sync_with_stdio(0);
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(a[j] > a[order[i - 1]] && (a[order[i]] == 0 || a[order[i]] > a[j])) {
order[i] = j;
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
g[order[i]].push_back(order[j]);
}
}
// for(int i = 1; i <= n; i++) cerr << order[i] << " "; cout << '\n';
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
// cout << i << " " << j << endl;
// cout << order[i] << " " << order[j] << endl;
auto it = find(g[order[i]].begin(), g[order[i]].end(), order[j]);
g[order[i]].erase(it);
g[order[j]].push_back(order[i]);
if(!ask(i, j)) {
auto it = find(g[order[j]].begin(), g[order[j]].end(), order[i]);
g[order[j]].erase(it);
g[order[i]].push_back(order[j]);
deg[order[j]]++;
Deg[order[j]]++;
for(int k = j + 1; k <= n; k++) {
auto it = find(g[order[i]].begin(), g[order[i]].end(), order[k]);
g[order[i]].erase(it);
}
break;
} else {
auto it = find(g[order[j]].begin(), g[order[j]].end(), order[i]);
g[order[j]].erase(it);
}
}
}
// for(int i = 1; i <= n; i++) {
// for(auto v : g[i]) {
// cout << i << " -> " << v << '\n';
// }
// }
priority_queue<int> q;
for(int i = 1; i <= n; i++) if(!deg[i]) q.push(i);
int cnt = 0;
while(!q.empty()) {
int v = q.top(); q.pop();
mx[v] = ++cnt;
for(auto u : g[v]) {
deg[u]--;
if(deg[u] == 0) {
q.push(u);
}
}
}
for(int i = 1; i <= n; i++) if(!Deg[i]) q.push(-i);
cnt = 0;
while(!q.empty()) {
int v = q.top(); q.pop();
v = -v;
mn[v] = ++cnt;
for(auto u : g[v]) {
Deg[u]--;
if(Deg[u] == 0) {
q.push(-u);
}
}
}
cout << "end\n";
for(int i = 1; i <= n; i++) cout << mn[i] << " ";
cout << '\n';
for(int i = 1; i <= n; i++) cout << mx[i] << " ";
cout << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |