真是写得太挫了。。
离散化+树状数组
3S。。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#include <iostream>
using namespace std;
struct node
{
int l,r;
node(){}
node(int a,int b){l=a,r=b;}
};
const int N=1000005*4;
int n,k;
node tm[1000005];
int cmp(node a,node b)
{
return a.l<b.l;
}
map <int ,int > to_num;
map <int ,int > to_val;
int tmp_num[N];
int tree[N];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int value)
{
for (int i=x;i<=4000000;i=i+lowbit(i))
{
tree[i]+=value;
}
}
int get(int x)
{
int sum=0;
for (int i=x;i;i-=lowbit(i))
{
sum+=tree[i];
}
return sum;
}
int pos[N];
int main()
{
int i;
cin>>n>>k;
int ok=0;
for (i=1;i<=n;i++)
{
scanf("%d%d",&tm[i].l,&tm[i].r);
tmp_num[ok++]=tm[i].l;
tmp_num[ok++]=tm[i].r;
}
sort(tmp_num,tmp_num+ok);
int len=0;
for (i=0;i<ok;i++)
{
if (i==0)
{
tmp_num[len++]=tmp_num[i];
}
else
if (tmp_num[i]==tmp_num[i-1])
continue;
else
tmp_num[len++]=tmp_num[i];
}
int tol=1;
for (i=0;i<len;i++)
{
to_num[tmp_num[i]]=tol;
to_val[tol]=tmp_num[i];
tol+=2;
}
for (i=1;i<=n;i++)
{
int tmpx=to_num[tm[i].l];
int tmpy=to_num[tm[i].r];
add(tmpx,1);
add(tmpy+1,-1);
}
for (i=1;i<=4000000;i++)
{
int x=get(i);
if (x>=k)
pos[i]=1;
}
int sum=0;
int last;
int line=1;
for (i=1;i<=4000000+2;i++)
{
if (pos[i]==1&&line)
last=i,line=0;
if (pos[i]==1)
continue;
if (pos[i]==0&&pos[i-1]==1)
{
tm[++sum]=node(to_val[last],to_val[i-1]);
last=i;line=1;
}
}
printf("%d\n",sum);
for (i=1;i<=sum;i++)
{
printf("%d %d\n",tm[i].l,tm[i].r);
}
return 0;
}