题意
- 现在有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;
标签:ABC,int,线段,相交,355,端点,Intersecting
From: https://www.cnblogs.com/lulu7/p/18216526