Codeforces#390

D:

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#define fi first
#define se second
using namespace std;
const int MAXN=3e5+5;
struct interval
{
    int l,r,id;
    bool operator < (const interval& rhs)const
    {
        return l==rhs.l?r<rhs.r:l<rhs.l;
    }
}p[MAXN];
int x[MAXN<<2],rf[MAXN<<1],sum[MAXN<<1];
int query(int pos)
{
    int res=0;
    for(int i=pos;i>0;i-=i&(-i))
        res+=sum[i];
    return res;
}
void update(int pos,int sz)
{
    for(int i=pos;i<=sz;i+=i&(-i))
        sum[i]++;
}
map<int,int>f;
int main()
{
    int n,k,tot=1;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&p[i].l,&p[i].r),f[p[i].l]++,f[p[i].r]++,p[i].id=i;
    for(map<int,int>::iterator i=f.begin();i!=f.end();i++)
        i->se=tot,rf[tot]=i->fi,tot++;
    int sz=f.size();
    sort(p+1,p+n+1);
    for(int i=1;i<=n;i++)
    {
        x[f[p[i].l]]++;
        x[f[p[i].r]+sz]++;
    }
    int flag,mxlen=0;
    for(int i=1,j=1,cnt=0;i<=sz;i++)
    {
        cnt+=x[i];
        while(f[p[j].l]==i)
            update(f[p[j].r],sz),j++;
        if(cnt>=k&&x[i]>0)
        {
            int l=i-1,r=sz+1;
            while(r-l>1)
            {
                int mid=(l+r)/2;
                if(cnt-(query(mid)-query(i-1))<k)
                    r=mid;
                else
                    l=mid;
            }
            if(rf[r]-rf[i]+1>mxlen)
                flag=i,mxlen=rf[r]-rf[i]+1;
        }
        cnt-=x[sz+i];
    }
    printf("%d\n",mxlen);
    if(mxlen==0)
    {
        for(int i=1;i<=k;i++)
            printf("%d ",i);
        return 0;
    }
    int L=rf[flag],R=rf[flag]+mxlen-1;
    for(int cnt=0,i=1;i<=n&&cnt<k;i++)
        if(p[i].l<=L&&p[i].r>=R)
            printf("%d ",p[i].id),cnt++;
    return 0;
}

 

posted on 2017-01-24 19:23    阅读(94)  评论(0编辑  收藏  举报

导航