題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=1651
題意:
給你n個線段[a,b],問你這些線段重疊最多的地方有幾層。
題解:
先將線段按左端點a升序排序。
開一個優先佇列q(升序排序),裡面存線段的右端點b。
列舉線段i,然後:
(1)將q中所有小於a[i]的元素彈出。
(2)插入b[i]。
(3)更新ans = max(ans,q.size())
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #define MAX_N 50005 7 8 using namespace std; 9 10 int n; 11 int ans=0; 12 pair<int,int> p[MAX_N]; 13 priority_queue<int,vector<int>,greater<int> > q; 14 15 int main() 16 { 17 cin>>n; 18 for(int i=0;i<n;i++) 19 { 20 cin>>p[i].first>>p[i].second; 21 } 22 sort(p,p+n); 23 for(int i=0;i<n;i++) 24 { 25 while(!q.empty() && q.top()<p[i].first) q.pop(); 26 q.push(p[i].second); 27 ans=max(ans,(int)q.size()); 28 } 29 cout<<ans<<endl; 30 }