复杂度 O(nlogn) n为事件数(本题事件数为线段数*2)。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #include<queue> #include<vector> #include<set> #include<stack> #include<map> #include<ctime> #include<bitset> #define LL long long #define db double #define EPS 1e-15 #define inf 1e10 using namespace std; int main(){ LL n,k,a,b,cur=0; scanf("%I64d%I64d",&n,&k); vector<pair<LL,LL> > event; vector<LL> ans; for (LL i=0;i<n;i++) { scanf("%I64d%I64d",&a,&b); event.push_back(make_pair(a,-1)); event.push_back(make_pair(b,1)); } sort(event.begin(),event.end()); int cnt=0; for (LL x=0;x<event.size();x++){ if (event[x].second==1){ if (cnt==k) ans.push_back(event[x].first); cnt--; } else { cnt++; if (cnt==k) ans.push_back(event[x].first); } } printf("%d\n",ans.size()/2); for (int x=0;x<ans.size()/2;x++) printf("%I64d %I64d\n", ans[x*2],ans[x*2+1]); return 0; }
上面说到扫描线经常可以和一些面积问题相结合,还可以使用某些数据结构来维护。
比如POJ 1151这个题就是利用了线段树来维护“事件”。
(未完待补)