acm-(思维、区间交) Codeforces Round #690 (Div. 3) F. The Treasure of The Segments

题面
传送门
考虑反面会更简单,也就是找到和某个线段不相交的线段个数,假设当前考虑线段为 ( 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);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值