#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(vector<int> &a, vector<int> &b){
if(a[0] == b[0]){
return a[1] < b[1];
}else{
return a[0] > b[0];
}
}
void bifind(vector<int>& dp, int num, int len){
int i = 1, j = len;
while(i <= j){
int mid = (i+j)/2;
if(num >= dp[mid]){
j = mid-1;
}else{
i = mid+1;
}
}
dp[i] = num;
}
void func(int n){
vector<vector<int > > nums(n,vector<int >(2));
for(int i=0; i<n; i++){
cin>>nums[i][0];
}
for(int i=0; i<n; i++){
cin>>nums[i][1];
}
sort(nums.begin(), nums.end(), cmp);//对数组进行排序,第一个数大的排前面,第一个数相等的话就把第二个数小的排前面。用一个dp数组保存有序数组的最后一位,dp[1]表示长度为1的有序数组的最后一位。用ans表示当前最长有序数组的长度。这样第一个数就已经是降序排列,依次遍历数组第二个数num,如果当前数num比dp[ans]小,则把它加进最长有序数组中ans++,dp[ans]=num;如果当前数num比dp[ans]大,则可以在当前有序数组中(dp数组),找到num第一个大于等于的数,将其替换成num,因为替换后的最长有序数组可以保持有序且更有包容性。
vector<int> dp(n+1);
dp[1] = nums[0][1];
int ans = 1;
for(int i=1; i<n; i++){
if(nums[i][1] < dp[ans]){
ans++;
dp[ans] = nums[i][1];
}else{
bifind(dp, nums[i][1], ans);
}
}
cout<<ans<<endl;
}
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
func(n);
}
return 0;
}