题目来源:http:///contest/612/problem/D
题意
在一个Ox的横轴上给出好多闭区间,问被这些闭区间覆盖k次或者k次以上的点的最少的区间的个数,以及区间。
思路
假设存在与y轴平行的一条线(无穷远处),然后从至右依次遍历这些点,遇到一个左边界,就+1,遇到右边界就-1,一旦有大于等于k的就存起来,由于不知道他有多少段符合条件的区间,所以用vector存下较为合适,其中pair的作用类似于结构体。。。
代码
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct pp
{
int l,r;
}s[2000000+10];
vector<pair<int,int> > v;
bool cmp(pp a,pp b)
{
if(a.l==b.l)
{
return a.r>b.r;
}
return a.l<b.l;
}
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=0;i<n;i++)
{
int l ,r;
scanf("%d%d",&l,&r);
s[2*i].l=l;
s[2*i].r=1;
s[2*i+1].l=r;
s[2*i+1].r=-1;
}
sort(s,s+2*n,cmp);
for(int i=1;i<2*n;i++)
{
s[i].r+=s[i-1].r;
}
for(int i=0;i<2*n;i++)
{
if(s[i].r>=k)
{
int x=s[i++].l,y;
while(s[i].r>=k) i++;
y=s[i].l;
v.push_back(make_pair(x,y));
}
}
int len=v.size();
printf("%d\n",len);
for(int i=0;i<v.size();i++)
{
printf("%d %d\n",v[i].first,v[i].second);
}
}
}