1.题目描述:
给定n个区间,问你被覆盖至少k次的区间(两端连续区间可以合并)最少有多少个,并输出。
某个区间被覆盖至少k次,意味着在它前面的区间起点至少有k个且这些区间的终点不能出现在它前面。这样sort下,直接统计,遇到起点加一,终点减一,每k个一记录就行了。
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
#define maxn 10100000
using namespace std;
struct node
{
int p, val;
}num[maxn];
int cmp(node a, node b)
{
if (a.val != b.val)
return a.val < b.val;
return a.p > b.p;
}
int ans[maxn];
int main()
{
int n, k, top, cnt, flag;
while (scanf("%d%d", &n, &k) != EOF)
{
top = 0;
cnt = 0;
flag = 0;
for (int i = 0; i < n; i++)
{
int sta, ed;
scanf("%d%d", &sta, &ed);
num[top].val = sta;
num[top++].p = 1;
num[top].val = ed;
num[top++].p = 0;
}
sort(num, num + top, cmp);
for (int i = 0; i < top; i++)
{
if (num[i].p)
{
flag++;
if (flag == k)
ans[cnt++] = num[i].val;
}
else
{
if (flag == k)
ans[cnt++] = num[i].val;
flag--;
}
}
printf("%d\n", cnt / 2);
for (int i = 0; i < cnt; i += 2)
printf("%d %d\n", ans[i], ans[i + 1]);
}
return 0;
}