题目链接:点击打开链接
给出n段线段, 有重合的部分, 输出所有线段, 要求有k部分重合.
对线段的左端点标记-1, 右端点标记1, 排序后进行遍历, sum记录重合的线段数, 记录到k - 1则标记左端点, 记录到k则push到ans.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
int n, k, x, sum;
std::vector<pair<int, int> > v, ans;
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; ++i) {
int l, r;
scanf("%d%d", &l, &r);
v.push_back(make_pair(l, -1));
v.push_back(make_pair(r, 1));
}
sort(v.begin(), v.end());
int len = v.size();
for(int i = 0; i < len; ++i) {
if(sum == k - 1 && v[i].second == -1) x = v[i].first;
if(sum == k && v[i].second == 1) ans.push_back(make_pair(x, v[i].first));
sum -= v[i].second;
}
len = ans.size();
cout << len << endl;
for(int i = 0; i < len; ++i)
printf("%d %d\n", ans[i].first, ans[i].second);
return 0;
}