传送门
考虑反面会更简单,也就是找到和某个线段不相交的线段个数,假设当前考虑线段为
(
l
,
r
)
(l,r)
(l,r),那么与它不相交的线段要么满足
r
′
<
l
r'<l
r′<l,要么满足
l
′
>
r
l'>r
l′>r,那么就
u
p
p
e
r
b
o
u
n
d
(
)
upper_bound()
upperbound()找即可,这里有个小技巧,将
r
r
r开成负数,这样就可以写成跟
l
l
l一样了(还不用特判)。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
const int inf = 2147483647;
int l[maxn<<1],r[maxn<<1];
struct Node{
int l,r;
}a[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int tot=0;
for(int i=0;i<n;++i){
scanf("%d%d",&a[i].l,&a[i].r);
l[tot]=a[i].l;
r[tot]=-a[i].r;
tot++;
}
sort(l,l+tot);
sort(r,r+tot);
int ans=inf;
for(int i=0;i<n;++i){
int num1=tot-(upper_bound(l,l+tot,a[i].r)-l);
int num2=tot-(upper_bound(r,r+tot,-a[i].l)-r);
ans=min(ans,num1+num2);
}
printf("%d\n",ans);
}
}