题解: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;
}