#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <numeric>
using namespace std;
int main() {
cin.tie(0)->sync_with_stdio(0);
int t; cin >> t;
while (t--) {
int n; cin >> n;
vector<int> a(n);
for (int &x : a) cin >> x;
vector<vector<int>> adj(n);
vector<int> indegree(n, 0), ans(n);
int step = 1;
vector<int> b(n);
iota(b.begin(), b.end(), 0);
while (b.size() > 1) {
vector<int> c;
int i2 = 0;
for (;i2 < b.size(); i2++) {
int u = b[i2];
if (a[u] != step) break;
if (i2 < b.size() - 1) {
int r = b[i2 + 1];
if (a[r] == step) {
if (step & 1) {
adj[u].push_back(r);
indegree[r]++;
} else {
adj[r].push_back(u);
indegree[u]++;
}
}
}
}
int j = b.size() - 1;
for (; j >= 0; j--) {
int u = b[j];
if (a[u] != step) break;
if (j > 0) {
int l = b[j - 1];
if (a[l] == step) {
if (step & 1) {
adj[u].push_back(l);
indegree[l]++;
} else {
adj[l].push_back(u);
indegree[u]++;
}
}
}
}
for (int i = i2; i < j + 1; i++) {
int u = b[i];
if (a[u] != step) {
c.push_back(u);
if (i > 0) {
int l = b[i - 1];
if (step & 1) { // local minima
adj[l].push_back(u);
indegree[u]++;
} else {
adj[u].push_back(l);
indegree[l]++;
}
}
if (i < b.size() - 1) {
int r = b[i + 1];
if (step & 1) {
adj[r].push_back(u);
indegree[u]++;
} else {
adj[u].push_back(r);
indegree[r]++;
}
}
} else { // a[u] == step
if (i == b.size() - 1) continue;
int r = b[i + 1];
// not sure if this even matters
if (a[r] == step) {
if (step & 1) {
adj[r].push_back(u);
indegree[u]++;
} else {
adj[u].push_back(r);
indegree[r]++;
}
}
}
}
// cout << "size of c: " << c.size() << endl;
b = c;
step++;
}
// for (int u = 0; u < n; u++) {
// for (int v : adj[u]) {
// cout << '(' << u << ", " << v << ')' << endl;
// }
// }
queue<int> q;
for (int i = 0; i < n; i++) if (indegree[i] == 0) q.push(i);
cout << q.size() << '\n';
int val = n;
while (!q.empty()) {
int u = q.front(); q.pop();
ans[u] = val--;
for (int v : adj[u]) {
indegree[v]--;
if (indegree[v] == 0) q.push(v);
}
}
for (int x : ans) cout << x << ' ';
cout << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxudW1lcmljPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CgljaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CglpbnQgdDsgY2luID4+IHQ7Cgl3aGlsZSAodC0tKSB7CgkJaW50IG47IGNpbiA+PiBuOwoJCXZlY3RvcjxpbnQ+IGEobik7CgkJZm9yIChpbnQgJnggOiBhKSBjaW4gPj4geDsKCQkKCQl2ZWN0b3I8dmVjdG9yPGludD4+IGFkaihuKTsKCQl2ZWN0b3I8aW50PiBpbmRlZ3JlZShuLCAwKSwgYW5zKG4pOwoJCWludCBzdGVwID0gMTsKCQl2ZWN0b3I8aW50PiBiKG4pOwoJCWlvdGEoYi5iZWdpbigpLCBiLmVuZCgpLCAwKTsKCQl3aGlsZSAoYi5zaXplKCkgPiAxKSB7IAoJCQl2ZWN0b3I8aW50PiBjOwoJCQlpbnQgaTIgPSAwOwoJCQlmb3IgKDtpMiA8IGIuc2l6ZSgpOyBpMisrKSB7CgkJCQlpbnQgdSA9IGJbaTJdOwoJCQkJaWYgKGFbdV0gIT0gc3RlcCkgYnJlYWs7CgkJCQlpZiAoaTIgPCBiLnNpemUoKSAtIDEpIHsKCQkJCQlpbnQgciA9IGJbaTIgKyAxXTsKCQkJCQlpZiAoYVtyXSA9PSBzdGVwKSB7CgkJCQkJCWlmIChzdGVwICYgMSkgewoJCQkJCQkJYWRqW3VdLnB1c2hfYmFjayhyKTsKCQkJCQkJCWluZGVncmVlW3JdKys7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlhZGpbcl0ucHVzaF9iYWNrKHUpOwoJCQkJCQkJaW5kZWdyZWVbdV0rKzsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpbnQgaiA9IGIuc2l6ZSgpIC0gMTsKCQkJZm9yICg7IGogPj0gMDsgai0tKSB7CgkJCQlpbnQgdSA9IGJbal07CgkJCQlpZiAoYVt1XSAhPSBzdGVwKSBicmVhazsKCQkJCWlmIChqID4gMCkgewoJCQkJCWludCBsID0gYltqIC0gMV07CgkJCQkJaWYgKGFbbF0gPT0gc3RlcCkgewoJCQkJCQlpZiAoc3RlcCAmIDEpIHsKCQkJCQkJCWFkalt1XS5wdXNoX2JhY2sobCk7CgkJCQkJCQlpbmRlZ3JlZVtsXSsrOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJYWRqW2xdLnB1c2hfYmFjayh1KTsKCQkJCQkJCWluZGVncmVlW3VdKys7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZm9yIChpbnQgaSA9IGkyOyBpIDwgaiArIDE7IGkrKykgewoJCQkJaW50IHUgPSBiW2ldOwoJCQkJaWYgKGFbdV0gIT0gc3RlcCkgewoJCQkJCWMucHVzaF9iYWNrKHUpOwoJCQkJCWlmIChpID4gMCkgewoJCQkJCQlpbnQgbCA9IGJbaSAtIDFdOwoJCQkJCQlpZiAoc3RlcCAmIDEpIHsgLy8gbG9jYWwgbWluaW1hIAoJCQkJCQkJYWRqW2xdLnB1c2hfYmFjayh1KTsKCQkJCQkJCWluZGVncmVlW3VdKys7CgkJCQkJCX0gIGVsc2UgewoJCQkJCQkJYWRqW3VdLnB1c2hfYmFjayhsKTsKCQkJCQkJCWluZGVncmVlW2xdKys7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKGkgPCBiLnNpemUoKSAtIDEpIHsKCQkJCQkJaW50IHIgPSBiW2kgKyAxXTsKCQkJCQkJaWYgKHN0ZXAgJiAxKSB7CgkJCQkJCQlhZGpbcl0ucHVzaF9iYWNrKHUpOwoJCQkJCQkJaW5kZWdyZWVbdV0rKzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWFkalt1XS5wdXNoX2JhY2socik7CgkJCQkJCQlpbmRlZ3JlZVtyXSsrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gYVt1XSA9PSBzdGVwCgkJCQkJaWYgKGkgPT0gYi5zaXplKCkgLSAxKSBjb250aW51ZTsKCQkJCQlpbnQgciA9IGJbaSArIDFdOwoJCQkJCS8vIG5vdCBzdXJlIGlmIHRoaXMgZXZlbiBtYXR0ZXJzCgkJCQkJaWYgKGFbcl0gPT0gc3RlcCkgewoJCQkJCQlpZiAoc3RlcCAmIDEpIHsKCQkJCQkJCWFkaltyXS5wdXNoX2JhY2sodSk7CgkJCQkJCQlpbmRlZ3JlZVt1XSsrOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJYWRqW3VdLnB1c2hfYmFjayhyKTsKCQkJCQkJCWluZGVncmVlW3JdKys7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8gY291dCA8PCAic2l6ZSBvZiBjOiAiIDw8IGMuc2l6ZSgpIDw8IGVuZGw7CgkJCWIgPSBjOwoJCQlzdGVwKys7CgkJfQoJCQoJCS8vIGZvciAoaW50IHUgPSAwOyB1IDwgbjsgdSsrKSB7CgkJLy8gCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQkvLyAJCWNvdXQgPDwgJygnIDw8IHUgPDwgIiwgIiA8PCB2IDw8ICcpJyA8PCBlbmRsOwoJCS8vIAl9CgkJLy8gfQoKCQlxdWV1ZTxpbnQ+IHE7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIGlmIChpbmRlZ3JlZVtpXSA9PSAwKSBxLnB1c2goaSk7CgkJCgkJY291dCA8PCBxLnNpemUoKSA8PCAnXG4nOwoKCQlpbnQgdmFsID0gbjsKCQl3aGlsZSAoIXEuZW1wdHkoKSkgewoJCQlpbnQgdSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsKCQkJYW5zW3VdID0gdmFsLS07CgkJCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQkJCWluZGVncmVlW3ZdLS07CgkJCQlpZiAoaW5kZWdyZWVbdl0gPT0gMCkgcS5wdXNoKHYpOwoJCQl9CgkJfQoKCQlmb3IgKGludCB4IDogYW5zKSBjb3V0IDw8IHggPDwgJyAnOwoJCWNvdXQgPDwgJ1xuJzsKCX0KfQoKCgkJCQkJCgoKCQkJCQkJCgoK