原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html

题目传送门 - ARC102D

题意

  给定 $L$,请你构造一个节点个数为 $n$ ,边数为 $m$ 的图,边带权,满足以下条件:

  1. $n\leq 20$

  2. $m\leq 60$

  3. 如果有向边 $a\rightarrow b$ 存在,那么 $a<b$ 。

  4. 从 $1$ 走到 $n$ 总共有 $L$ 种不同的路径,这 $L$ 条路径的长度分别为 $0,1,\cdots , L-1$ 。

  $L\leq 10^6$

题解

  垃圾翻译告诉我 $n\geq 20$ 。于是我立马构造了一个 $40$ 个点的图来满足。在看样例的时候,我发现读错了题目。

  然后我就一直在想如何用 $2^k$ 的边权来构造。不知道为什么我只在想用这种边权构造。

  然后我扔掉这种做法想出了一个 AC 做法,5分钟敲完 AC 了。赛后,Funtionendless 给我讲了一下他口胡的做法,然而我发现和我之前想的假做法好像,说他是错的;然后最后我发现我…… 于是我又知道了一种做法。

  由于这两种做法的正确性都比较显然,所以不加解释。

  做法1:by me

  1. build(x,L){//以x为当前子图的最小标号节点,构造一个具有 [0,L] 的路径长度的图
  2. if (L==0){
  3. AddEdge(x,n,0);
  4. return;
  5. }
  6. if (L==1){
  7. AddEdge(x,n,0);
  8. AddEdge(x,n,1);
  9. return;
  10. }
  11. y=NewNode();
  12. if (L mod 2==0)
  13. AddEdge(x,n,L);
  14. if (L mod 2==0)
  15. L=L div 2-1;
  16. else
  17. L=L div 2;
  18. AddEdge(x,y,0);
  19. AddEdge(x,y,L);
  20. build(y,L);
  21. }

  

  做法2:by Funtionendless

  1. int calc(int x,int i){//以x为当前子图的最小标号节点,构造一个具有 [0,L) 的路径长度的图
  2. return x&~((1<<(i+1))-1);
  3. }
  4. int GetD(int x,int i){
  5. return xi次二进制位;
  6. }
  7. n=20;
  8. build(x,L){
  9. for (i = 0 to 18){
  10. AddEdge(i+1,i+2,Pow(2,i));
  11. AddEdge(i+1,i+2,0);
  12. }
  13. if (GetD(0))
  14. AddEdge(1,n,calc(L,0));
  15. for (i = 1 to 19)
  16. if (GetD(L,i)==1)
  17. AddEdge(i,n,calc(L,i));
  18. }

  

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N=105;
  5. LL read(){
  6. LL x=0,f=1;
  7. char ch=getchar();
  8. while (!isdigit(ch)&&ch!='-')
  9. ch=getchar();
  10. if (ch=='-')
  11. f=-1,ch=getchar();
  12. while (isdigit(ch))
  13. x=(x<<1)+(x<<3)+ch-48,ch=getchar();
  14. return x*f;
  15. }
  16. int n,m=0,L;
  17. int A[N],B[N],C[N];
  18. void push(int a,int b,int c){
  19. m++;
  20. A[m]=a;
  21. B[m]=b;
  22. C[m]=c;
  23. }
  24. int main(){
  25. L=read()-1;
  26. n=20;
  27. int cnt=1;
  28. while (L>=0){
  29. if (L==0){
  30. if (cnt<n)
  31. push(cnt,n,0);
  32. break;
  33. }
  34. if (L==1){
  35. push(cnt,n,0);
  36. push(cnt,n,1);
  37. break;
  38. }
  39. if (L%2==0)
  40. push(cnt,n,L);
  41. L=(L+1)/2;
  42. push(cnt,cnt+1,0);
  43. push(cnt,cnt+1,L);
  44. L--;
  45. cnt++;
  46. }
  47. printf("%d %d\n",n,m);
  48. for (int i=1;i<=m;i++)
  49. printf("%d %d %d\n",A[i],B[i],C[i]);
  50. return 0;
  51. }

  

AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造的更多相关文章

  1. AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARD102E.html 题目传送门 - ARC102E 题意 有 $n$ 个取值为 $[1,k]$ 的骰子,对于 ...

  2. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  3. AtCoder Regular Contest 102 E Stop. Otherwise...

    题目链接:atcoder 大意:有\(n\)个骰子,每个骰子上面有\(k\)个数,分别是\(1\text ~ k\),现在求\(\forall i\in[2...2k]\),求出有多少种骰子点数的组合 ...

  4. AtCoder Regular Contest 102 D - All Your Paths are Different Lengths

    D - All Your Paths are Different Lengths 思路: 二进制构造 首先找到最大的t,使得2^t <= l 然后我们就能构造一种方法使得正好存在 0 到 2^t ...

  5. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  6. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  7. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  8. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  9. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

随机推荐

  1. event & signals & threads

    The Event Systemhttp://doc.qt.io/qt-4.8/eventsandfilters.html Each thread can have its own event loo ...

  2. PYTHON深拷贝与浅拷贝

    浅拷贝就是对引用的拷贝,深拷贝就是对对象的资源的拷贝 浅拷贝 浅拷贝仅仅复制了容器中元素的地址 赋值的原则 1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 2.修改不可 ...

  3. java按照关键字指定的key删除redis(支持模糊删除)

    pom依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</a ...

  4. 自定义admin(self_admin)

    admin.site.register(models.UserInfo)admin.site.register(models.Book,Book_admin)######当下面注册的这个表里面没有这个 ...

  5. 监听 input上传文件, 获取文件名称,

    <div class="import-box pr" > <span class="model-address-txt">导入文件:&l ...

  6. PL/SQL设置

    PL/SQL 自定义快捷键(比如输入s,直接就显示select * from) 1.1 修改Code assistant快捷键tools->preferences->User Interf ...

  7. 移动端的dl

    https://blog.csdn.net/u013139259/article/details/52143240

  8. AngularJs中,如何在ng-repeat完成之后,执行Js脚本

    //ng-repeat生成4个li,生成后再执行自定义方法fn在每个li后加一根横线 <script> var myapp=angular.module('myapp',[]); myap ...

  9. Python基础之模块与包

    一.模块 1.什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函 ...

  10. fdisk命令

    fdisk -l命令详解 Disk /dev/sda: 53.7 GB, 53687091200 bytes 块设备名称为/dev/sda,此设备的大小为53.7GB,这个数字不是特别精确,我系统是5 ...