题解:AT_abc355_d [ABC355D] Intersecting Intervals

分析:

本题十分简单。

首先我把这些区间按 r 从小到大排个序,保证 r 单调递增。然后依次遍历每个区间,因为我们保证了 r 单调递增的,所以我们只需要看当前区间的 l 小于等于前面哪些的 r ,然后累加起来就好了,但时间复杂度是 O(n2),我们就要加一点点优化,我们在前面保证了 r 单调递增,于是在看当前区间的 l 小于等于前面哪些的 r 时,我们就不用一个一个去遍历,只需用二分就好了,时间复杂度是 O(nlog)非常快

code

码风良好

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
	long long l,r;
}a[1000005];
bool cmp(node x,node y){
	return x.r<y.r;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
	}
	sort(a+1,a+1+n,cmp);
	long long x=-1,cnt=0;
	for(int i=1;i<=n;i++){
		int x=1,y=i-1;
		while(x<=y){
			int mid=(x+y)/2;
			if(a[i].l<=a[mid].r){
				y=mid-1;
			}
			else{
				x=mid+1;
			}
		}
		cnt+=(i-1)-x+1;
	}
	cout<<cnt;
	return 0;
}
posted @ 2025-04-30 18:44  yxbb  阅读(21)  评论(0)    收藏  举报