zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
  • 相关阅读:
    DP:Multiplication Puzzle(POJ 1651)
    Heap:Expedition(POJ 2431)
    velocity.js 动画插件
    ES6 新特性
    ps p图
    php 建站 多域名配置 自定义重定向
    移动端开发 资源分享
    拖拽 初体验
    颜色选择器 rgb 与16进制 颜色转换
    web 常用颜色
  • 原文地址:https://www.cnblogs.com/homura/p/6347720.html
Copyright © 2011-2022 走看看