#include <iostream>
#include <stdio.h>
#include <map>
#include <set>
#include <string.h>
#include <algorithm>
using namespace std;
map< int , int > Meng;
set< int > zhu;
const int N = 200000;
struct Men{
int l,r;
bool operator < (const Men & A) const{
if (l!=A.l) return l<A.l;
return r<A.r;
}
void input(){
scanf("%d%d",&l,&r);
}
}p[N],q[N];
int n;
void solve(){
Meng.clear();
zhu.clear();
scanf("%d",&n);
for (int i = 1 ; i <= n ; ++ i) p[i].input();
for (int i = 1 ; i <= n ; ++ i) q[i].input();
sort(p + 1 , p + 1 + n);
sort(q + 1 , q + 1 + n);
int j=1,ans = 0;
for (int i = 1 ; i <= n ; ++ i){
while(q[j].l <= p[i].l && j <= n){
zhu.insert(-q[j].r);
Meng[-q[j].r]++;
j++;
}
set<int> :: iterator iter=zhu.lower_bound(-p[i].r);
if (iter != zhu.end()){
++ans;
int now = *iter;
--Meng[now];
if (Meng[now]==0){
zhu.erase(now);
}
}
}
printf("%d\n",ans);
}
int main(){
int _;
cin >> _;
while ( _-- ) solve();
}
lower_bound()返回一个 iterator 它指向在[first,last)标记的 有序序列 中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个 大于等于 value 的值。
按h第一关键字w第二关键字排序,每次找到最大的<=p[i].w的删除。set和map用好了