ABC 355 D題Intersecting Intervals

Linear_L發表於2024-05-27

題意

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

相關文章