This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")
#pragma GCC optimize("unroll-loops")
*/
#include <bits/stdc++.h>
#define taskname "bai3"
#define int long long
#define all(x) x.begin(), x.end()
#define float long double
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define endl '\n'
#define pii pair<int, int>
using namespace std;
const int mxN = 1e5 + 5;
const int mod = 1e9 + 7;
const int oo = 0x3f3f3f3f;
int n, cnt, p[105], trc[105], idx[105], pos[105], pf[105], ans[105], trc1[105], ans1[105];
bool vis[105];
vector<int> top_sort, G[105], Gr[105], Gr1[105];
void dfs(int node, int x, int y){
for(auto u : G[node]){
if(!vis[u] && x <= u && u <= y){
vis[u] = true;
dfs(u, x, y);
}
}
top_sort.pb(node);
}
int ask(int x, int y){
//cout << x << " " << y << endl;
memset(vis, 0, sizeof(vis));
top_sort.clear();
G[y].pb(x);
for(int i = x; i <= y; ++i){
if(!vis[i]){
vis[i] = true;
dfs(i, x, y);
}
}
reverse(all(top_sort));
for(int i = x; i <= y; ++i){
//cout << top_sort[i - x] << " ";
idx[top_sort[i - x]] = i;
}
//cout << endl;
for(int i = x; i <= y; ++i){
for(int j : G[i]){
if(x <= j && j <= y && idx[j] <= idx[i]){
G[y].pop_back();
return -1;
}
}
}
G[y].pop_back();
vector<int> idxx;
for(int i = 1; i < x; ++i) idxx.pb(i);
for(int i = x; i <= y; ++i){
idxx.pb(top_sort[i - x]);
}
for(int i = y + 1; i <= n; ++i) idxx.pb(i);
for(int i = 0; i < n; ++i){
pf[pos[idxx[i]]] = i + 1;
}
cout << "query ";
for(int i = 1; i <= n; ++i){
cout << pf[i] << " ";
}
cout << endl; cout.flush();
int tmp; cin >> tmp;
if(tmp == 0){
G[x].pb(y);
Gr[pos[x]].pb(pos[y]);
//cout << pos[x] << " " << pos[y] << endl;
trc[pos[y]]++;
}
}
void solve(){
cin >> n;
for(int i = 1; i <= n; ++i){
cin >> p[i];
pos[p[i]] = i;
}
for(int range = 1; range < n; ++range){
for(int i = 1; i <= n - range; ++i){
int tmp = ask(i, i + range);
}
}
cout << "end\n";
priority_queue<int> pq;
for(int i = 1; i <= n; ++i){
// << trc[i] << " ";
if(trc[i] == 0){
pq.push(i);
}
}
cout << endl;
while(!pq.empty()){
int tmp = pq.top();
pq.pop();
ans[tmp] = ++cnt;
for(int v : Gr[tmp]){
trc[v]--;
if(trc[v] == 0) pq.push(v);
}
}
for(int i = 1; i <= n; ++i){
for(int v : Gr[i]){
Gr1[v].pb(i);
trc1[i]++;
}
}
for(int i = 1; i <= n; ++i){
if(trc1[i] == 0){
pq.push(i);
}
}
while(!pq.empty()){
int tmp = pq.top();
pq.pop();
ans1[tmp] = cnt--;
for(int v : Gr1[tmp]){
trc1[v]--;
if(trc1[v] == 0) pq.push(v);
}
}
for(int i = 1; i <= n; ++i){
cout << ans1[i] << " ";
}
cout << endl;
for(int i = 1; i <= n; ++i){
cout << ans[i] << " ";
}
cout << endl;
}
signed main(){
//ios_base::sync_with_stdio(false);
//cin.tie(nullptr);
//freopen(taskname".inp", "r", stdin);
//freopen(taskname".out", "w", stdout);
int t = 1; //cin >> t;
while(t--) solve();
}
Compilation message (stderr)
zagonetka.cpp: In function 'void solve()':
zagonetka.cpp:89:17: warning: unused variable 'tmp' [-Wunused-variable]
89 | int tmp = ask(i, i + range);
| ^~~
zagonetka.cpp: In function 'long long int ask(long long int, long long int)':
zagonetka.cpp:59:17: warning: control reaches end of non-void function [-Wreturn-type]
59 | vector<int> idxx;
| ^~~~
# | 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... |