扫描线
一个区间左赋值1 右-1
排序,历遍,为k,记录为被覆盖k次的一个左区间,flag=1
不为k,flag=0,记录为被覆盖k次的一个右区间
历完,输出即可
代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e6+5;
const int mod=1e9+7;
const double eps=1e-9;
struct node{
int index,val;
bool operator <(const node &b) const{
if(index==b.index)
return val>b.val;
return index<b.index;
};
}a[maxn],b[maxn];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
fo2(i,n){
scanf("%d%d",&a[2*i-1].index,&a[2*i].index);
a[2*i-1].val=1,a[2*i].val=-1;
}
sort(a+1,a+1+2*n);
int ans=0,cnt=0;
bool f=0;
fo2(i,2*n){
cnt+=a[i].val;
if(cnt==k&&!f)
b[++ans].index=a[i].index,f=!f;
else if(cnt<k&&f)
b[++ans].index=a[i].index,f=!f;
}
ans/=2;
printf("%d\n",ans);
fo2(i,ans)
printf("%d %d\n",b[2*i-1].index,b[2*i].index);
return 0;
}