題意
- 現在有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;