ABC 355 D题Intersecting Intervals

题意

  • 现在有n条线段,每条线段的左端点和右端点依次给出,求有多少对线段有交集。

思路

  • 考虑正难则反的想法,我们考虑着n条线段全部两两相交的时候,那么答案就是(n-1)*n/2,现在我们要求出有多少对线段是不相交的。
  • 当两条线段不相交的时候,显然有其中一条线段的左端点严格大于另一条线段的右端点的。所以对于上述问题,我们先对所有的右端点进行升序排序,然后O(n)遍历所有线段的左端点,通过lower_bound查找有多少右端点小于当前的左端点。

代码

int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
sort(r+1,r+1+n);
int ans=(n-1)*n/2;
for(int i=1;i<=n;i++)
{
	int flag=lower_bound(r+1,r+1+n,l[i])-r-1;
	//cout<<flag<<"qwq"<<endl; 
	ans-=flag;
}
cout<<ans<<endl;

return 0;
posted on 2024-05-27 21:09  Linear_L  阅读(42)  评论(0编辑  收藏  举报