#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
typedef long long ll;
typedef pair< int , int > pii;
typedef unsigned long long ull;
#ifndef ONLINE_JUDGE
void RI(vector< int >&a, int n){a.resize(n); for ( int i=0;i<n;i++) scanf ( "%d" ,&a[i]);}
void RI(){} void RI( int &X){ scanf ( "%d" ,&X);} template < typename ...R>
void RI( int &f,R&...r){RI(f);RI(r...);} void RI( int *p, int *q){ int d=p<q?1:-1;
while (p!=q){ scanf ( "%d" ,p);p+=d;}} void print(){cout<<endl;} template < typename T>
void print( const T t){cout<<t<<endl;} template < typename F, typename ...R>
void print( const F f, const R...r){cout<<f<< ", " ;print(r...);} template < typename T>
void print(T*p, T*q){ int d=p<q?1:-1; while (p!=q){cout<<*p<< ", " ;p+=d;}cout<<endl;}
#endif
template < typename T> bool umax(T&a, const T&b){ return b<=a? false :(a=b, true );}
template < typename T> bool umin(T&a, const T&b){ return b>=a? false :(a=b, true );}
template < typename T>
void V2A(T a[], const vector<T>&b){ for ( int i=0;i<b.size();i++)a[i]=b[i];}
template < typename T>
void A2V(vector<T>&a, const T b[]){ for ( int i=0;i<a.size();i++)a[i]=b[i];}
const double PI = acos (-1.0);
const int INF = 1e9 + 7;
/* -------------------------------------------------------------------------------- */
const int maxn = 1e5 + 7;
const int M = 1e9;
struct Node {
int L, R, id;
bool operator < ( const Node &that) const {
return R < that.R;
}
Node( int L, int R, int id): L(L), R(R), id(id) {}
Node() {}
};
multiset<Node> S;
int L[maxn], R[maxn];
pii node[maxn];
vector< int > G[maxn];
int main() {
#ifndef ONLINE_JUDGE
freopen ( "in.txt" , "r" , stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
int T;
cin >> T;
while (T --) {
int n;
cin >> n;
S.clear();
for ( int i = 0; i <= n; i ++) {
G[i].clear();
}
for ( int i = 0; i < n; i ++) {
scanf ( "%d" , L + i);
G[L[i]].pb(i);
}
for ( int i = 0; i < n; i ++) {
scanf ( "%d" , R + i);
node[i] = mp(L[i], R[i]);
}
for ( int i = 0; i < G[0].size(); i ++) {
int id = G[0][i];
S.insert(Node(node[id].X, node[id].Y, id));
}
vector< int > ans;
vector< bool > vis(n);
int cnt = 0;
while (1) {
multiset<Node>::iterator iter = S.lower_bound(Node(0, cnt, 0));
if (iter == S.end()) break ;
ans.pb((*iter).id);
vis[(*iter).id] = true ;
S.erase(iter);
cnt ++;
for ( int i = 0; i < G[cnt].size(); i ++) {
int id = G[cnt][i];
S.insert(Node(node[id].X, node[id].Y, id));
}
}
for ( int i = 0; i < n; i ++) {
if (!vis[i]) ans.pb(i);
}
printf ( "%d\n" , cnt);
for ( int i = 0; i < n; i ++) {
printf ( "%d%c" , ans[i] + 1, i == n - 1? ‘\n‘ : ‘ ‘ );
}
}
return 0;
}
|