zoukankan      html  css  js  c++  java
  • Codeforces404C【构造】

    题意:

    一个图有n个点,每一个点最多连接k条直线,给出多有起点到终点的距离,没有环,不能输出重边,输出所有有连接的单向边

    思路:
    就是简单想…不知道怎么说了,画个图,我们建边,那么距离是 i 就是连距离 i - 1的,我是记录了一下 i -1 的位置,防止小T。。。随便搞吧。。

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    typedef __int64 LL;
    
    const int N=1e5+10;
    
    struct asd{
        int id;
        int c;
        int num;
    };
    asd q[N];
    int sta[N];
    int pos[N];
    int xx[N*10],yy[N*10];
    int k,n;
    
    bool cmp(asd x,asd y)
    {
        return x.num<y.num;
    }
    
    void make_pos()
    {
        int ss=-1;
        for(int i=1;i<=n;i++)
        {
            if(q[i].num>=ss)
            {
                ss=q[i].num;
                pos[ss]=i;
            }
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&k);
        memset(sta,0,sizeof(sta));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&q[i].num);
            sta[q[i].num]++;
            q[i].c=0;
            q[i].id=i;
        }
        sort(q+1,q+n+1,cmp);
    
    
        if(sta[0]!=1)
        {
            puts("-1");
            return 0;
        }
    
        make_pos();
        int cnt=0;
        for(int i=2;i<=n;i++)
        {
            if(sta[q[i].num-1])
            {
                for(int j=pos[q[i].num-1];j>=1;j--)
                {
                    if(q[j].num==q[i].num-1&&q[j].c<k)
                    {
                        xx[cnt]=q[j].id;
                        yy[cnt++]=q[i].id;
                        q[j].c++;
                        q[i].c++;
                        if(q[i].c==k)
                            sta[q[i].num]--;
                        if(q[j].c==k)
                        {
                            sta[q[j].num]--;
                            pos[q[j].num]=j-1;
                        }
                        break;
                    }
                }
            }
            else
            {
                puts("-1");
                return 0;
            }
        }
        printf("%d
    ",cnt);
        for(int i=0;i<cnt;i++)
            printf("%d %d
    ",xx[i],yy[i]);
        return 0;
    }
  • 相关阅读:
    欧拉路问题
    树上依赖背包总结
    树状数组的应用
    KMP
    深探树形dp
    再探树形dp
    日常水题
    深入hash
    同一控制下的企业合并,长期股权投资成本与支付账面之间的差额计入资本公积
    资本公积冲减留存收益
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934901.html
Copyright © 2011-2022 走看看