Advertisement

上海计算机学会2022年9月月赛C++乙组T1区间交集(二)

阅读量:

区间交集(二)

内存限制: 256 Mb 时间限制: 1000 ms

题目描述

给定 n 个数轴上的闭区间,请统计有多少对区间的交集不是空集。

输入格式

第一行:一个整数 n;
接下来 n 行:每行两个整数 ai​ 与 bi​,表示一个闭区间的左端点与右端点。

输出格式

单个整数:表示有多少对区间的交集不是空集。

数据范围
  • 对于 30% 的数据,1≤n≤5,000;
  • 对于 60% 的数据,1≤n≤20,000;
  • 对于 100% 的数据,1≤n≤300,000;
  • 1≤ai​≤bi​≤1,000,000;
样例数据

输入:
3
1 10
1 4
5 12
输出:
2

输入:
2
1 2
2 3
输出:
1
说明:
两个闭区间的交可能只有一个数字,在这种情况下,也是符合非空要求的。

输入:
5
1 10
3 4
6 8
2 9
7 7

输出:
8

解析:二分法,详见代码:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int n;
    
 long long ans=0;
    
 struct node{
    
     int l;
    
     int r;
    
 } a[300005];
    
 bool cmp(struct node a,struct node b){
    
     return a.l<b.l;//按起点从小到大排序
    
 }
    
 int main(){
    
     cin>>n;
    
     for (int i=1;i<=n;i++){
    
     cin>>a[i].l>>a[i].r;
    
     }
    
     sort(a+1,a+n+1,cmp);//排序
    
     for (int i=1;i<=n-1;i++){//枚举每个区间
    
     int lp=i,rp=n;//二分法求它后边第一个跟它不相交的
    
     while (lp<rp){
    
         int mp=(lp+rp+1)/2;
    
         if ( a[i].r<a[mp].l){
    
             rp=mp-1;
    
         }else {
    
             lp=mp;
    
         }
    
     }
    
     ans+=rp-i;//增加数量
    
     }
    
     cout<<ans;
    
     return 0;
    
 }
    
    
    
    
    AI写代码cpp
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/lF4ECq5XRoN6rbSxWYmjLIA9cPJh.png)

全部评论 (0)

还没有任何评论哟~