Educational Codeforces Round 4 D 扫描线
转自https://blog.csdn.net/libin66/article/details/52132641
给定n个线段[l,r],问哪些区间正好被线段覆盖了k次。输出这样的区间个数,以及区间
进去一个区间(扫描到L) num++,退出时 (扫描到R)num--;
令num=0
如果有三个区间覆盖
则一直扫描了3个L ,num加了三次,则num的数量就是当前覆盖区间的数量
同时出去时num--来减少覆盖区间数量
pair正好能够记录区间端点并且用1 ,-1 记录左右,同时sort pair 默认是按照first,其次是second
typedef pair<int, int> P;
vector<P> v;
v.push_back(make_pair(l, 0));
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> P;
int main() {
int n, k;
scanf("%d %d", &n, &k);
int l, r;
vector<P> v;
int i;
for(i = 0; i < n; i++) {
scanf("%d %d", &l, &r);
v.push_back(make_pair(l, -1)); //注意0 1的分配,由小到大排序
v.push_back(make_pair(r, 1));
}
sort(v.begin(), v.end());
int cnt = 0;
vector<int> ans;
for(i = 0; i < v.size(); i++) {
if(v[i].second == -1) {
cnt++; //注意判断的顺序
if(cnt == k) ans.push_back(v[i].first);
}
else {
if(cnt == k) ans.push_back(v[i].first);
cnt--;
}
}
printf("%d\n", ans.size() / 2);
for(i = 0; i < ans.size() / 2; i++) {
printf("%d %d\n", ans[2 * i], ans[2 * i + 1]);//为什么肯定这个区间端点在2*i 和2*i+1 因为退出的第一个肯定是和之前放进ans里面的相配对,而且是先判定再cnt--
}
return 0;
}