cf612D-The Union of k-Segments(思路题(类似扫描线))

题目来源: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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值