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;
    }
  • 相关阅读:
    Linux下vi和vim模式相互切换
    Linux文件系统目录
    华硕笔记本(UEFI)支持U盘启动
    什么是RSS feed?订阅RSS有什么好处?
    JSTL的时间格式化标签的使用
    token session区别 以及JWT无状态token
    c++ 重载成员函数的地址如何获取
    c++ __VA_ARGS__
    协程任务调度器
    yield return 1
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934901.html
Copyright © 2011-2022 走看看