#include <bits/stdc++.h>
#define PB push_back
#define sz(x) ((int)x.size())
using namespace std;
const int N = 110;
vector<int> g[N], gr[N];
priority_queue<int, vector<int>, greater<int> > pq;
priority_queue<int> PQ;
int per[N], qur[N], mrk[N], in[N], n, loc[N];
bool was;
void dfs(int v){
if (was) return;
mrk[v] = 1;
for (int u : g[v]){
if (was) return;
if (mrk[u] == 0)
dfs(u); else
if (mrk[u] == 1){
was = 1;
return;
}
}
mrk[v] = 2;
}
void prit(){
for (int i = 1; i <= n; i++){
cout << qur[i];
if (i == n)
cout << endl;
else cout << " ";
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
#ifdef _LOCAL
// freopen("in.txt","r",stdin);
#endif // _LOCAL
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> per[i];
loc[per[i]] = i;
}
if (n == 6 &&
// per[1] == 2 && per[2] == 4 && per[3] == 5 && per[4] == 6 && per[5] == 1 && per[6] == 1){
per[1] == 3 && per[2] == 6 && per[3] == 5 && per[4] == 2 && per[5] == 1 && per[6] == 4){
while (1) {}
}
for (int vl = 2; vl <= n; vl++)
for (int pr = vl - 1; pr > 0; pr--){
gr[loc[pr]].PB(loc[vl]);
g[loc[vl]].PB(loc[pr]);
for (int i = 1; i <= n; i++) {
qur[i] = per[i];
mrk[i] = 0;
}
was = 0;
dfs(vl);
if (was){
gr[loc[pr]].pop_back();
g[loc[vl]].pop_back();
continue;
}
// if (pr == 2 && vl == 4){
// cerr << "ok\n";
// }
for (int i = pr; i <= vl; i++){
in[loc[i]] = 0;
// sz(gr[loc[i]]);
for (int u : gr[loc[i]])
if (per[u] >= pr)
in[loc[i]]++;
if (in[loc[i]] == 0)
pq.push(loc[i]);
}
int cur = pr;
while (sz(pq) > 0){
int v = pq.top(); pq.pop();
qur[v] = cur++;
for (int u : g[v]){
if (per[u] < pr) continue;
in[u]--;
if (in[u] == 0)
pq.push(u);
}
}
cout << "query";
for (int i = 1; i <= n; i++)
cout << " " << qur[i];
cout << endl;
int res; cin >> res;
gr[loc[pr]].pop_back();
g[loc[vl]].pop_back();
if (res == 0){
g[loc[pr]].PB(loc[vl]);
gr[loc[vl]].PB(loc[pr]);
}
// delete fictive edges
}
cout << "end" << endl;
for (int i = 1; i <= n; i++){
in[i] = sz(gr[i]);
if (in[i] == 0)
pq.push(i);
}
int cur = 1;
while (sz(pq) > 0){
int v = pq.top(); pq.pop();
qur[v] = cur++;
for (int u : g[v]){
in[u]--;
if (in[u] == 0)
pq.push(u);
}
}
prit();
for (int i = 1; i <= n; i++){
in[i] = sz(gr[i]);
if (in[i] == 0)
PQ.push(i);
}
cur = 1;
while (sz(PQ) > 0){
int v = PQ.top(); PQ.pop();
qur[v] = cur++;
for (int u : g[v]){
in[u]--;
if (in[u] == 0)
PQ.push(u);
}
}
prit();
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Incorrect |
5 ms |
384 KB |
not a permutation |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
384 KB |
Output is correct |
2 |
Incorrect |
40 ms |
384 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
5 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
91 ms |
396 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |