zoukankan      html  css  js  c++  java
  • ARC102D All Your Paths are Different Lengths

    传送门

    题目大意

    让你构造一个有向图,使得从1到n有L条不同路径且长度分别是0~L-1。

    分析

    我们不难想到每一对相邻点之间连一条权值为0的边,之后二进制分解,将每一对点之间连一个权值为2^i的边,但是我们会发现这样在一些情况下还会剩下一些值不能覆盖。如果将剩下的值一一连边肯定会炸。于是我们还是利用二进制的思想,从最后一个点开始向前枚举,如果在这个点加上一条权值为之前不能构成的值中的最小值的边构成的数不会越界则加上这一条边。描述比较粗略,详见代码。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    const int LOG = 20;
    int ans[1100],ans2[1100],ans3[1100];
    int main(){
          int n,m=0,l,i,j,k;
          scanf("%d",&l);
          for(i=0;i<=LOG;i++)
            if((1<<i)>l){
              n=i;
              break;
            }
          for(i=1;i<n;i++){
              ans[++m]=i;
              ans2[m]=i+1;
              ans3[m]=0;
              ans[++m]=i;
              ans2[m]=i+1;
              ans3[m]=1<<(i-1);
          }
          int t=1<<(n-1);
          l-=t;
          for(i=n-1;i>0;i--)
            if((1<<(i-1))<=l){
              ans[++m]=i;
              ans2[m]=n;
              ans3[m]=t;
              t+=1<<(i-1);
              l-=1<<(i-1);
          }
          printf("%d %d
    ",n,m);
          for(i=1;i<=m;i++)
            printf("%d %d %d
    ",ans[i],ans2[i],ans3[i]);
          return 0;
    }
  • 相关阅读:
    zap日志库
    Go Logger库基本使用
    golang中的MySQL增删改查
    golang链接mysql
    文件上傳
    參數綁定:
    gin獲取path參數
    gin獲取form提交的表單數據
    獲取query string
    返回json
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9694800.html
Copyright © 2011-2022 走看看