原文链接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

build(x,L){//以x为当前子图的最小标号节点,构造一个具有 [0,L] 的路径长度的图
if (L==0){
AddEdge(x,n,0);
return;
}
if (L==1){
AddEdge(x,n,0);
AddEdge(x,n,1);
return;
}
y=NewNode();
if (L mod 2==0)
AddEdge(x,n,L);
if (L mod 2==0)
L=L div 2-1;
else
L=L div 2;
AddEdge(x,y,0);
AddEdge(x,y,L);
build(y,L);
}

  

  做法2:by Funtionendless

int calc(int x,int i){//以x为当前子图的最小标号节点,构造一个具有 [0,L) 的路径长度的图
return x&~((1<<(i+1))-1);
}
int GetD(int x,int i){
return x的i次二进制位;
}
n=20;
build(x,L){
for (i = 0 to 18){
AddEdge(i+1,i+2,Pow(2,i));
AddEdge(i+1,i+2,0);
}
if (GetD(0))
AddEdge(1,n,calc(L,0));
for (i = 1 to 19)
if (GetD(L,i)==1)
AddEdge(i,n,calc(L,i));
}

  

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=105;
LL read(){
LL x=0,f=1;
char ch=getchar();
while (!isdigit(ch)&&ch!='-')
ch=getchar();
if (ch=='-')
f=-1,ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*f;
}
int n,m=0,L;
int A[N],B[N],C[N];
void push(int a,int b,int c){
m++;
A[m]=a;
B[m]=b;
C[m]=c;
}
int main(){
L=read()-1;
n=20;
int cnt=1;
while (L>=0){
if (L==0){
if (cnt<n)
push(cnt,n,0);
break;
}
if (L==1){
push(cnt,n,0);
push(cnt,n,1);
break;
}
if (L%2==0)
push(cnt,n,L);
L=(L+1)/2;
push(cnt,cnt+1,0);
push(cnt,cnt+1,L);
L--;
cnt++;
}
printf("%d %d\n",n,m);
for (int i=1;i<=m;i++)
printf("%d %d %d\n",A[i],B[i],C[i]);
return 0;
}

  

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. signal & slot

    The Qt signals/slots and property system are based on the ability to introspect the objects at runti ...

  2. php正则替换函数-----preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

    preg_replace — 执行一个正则表达式的搜索和替换 说明 mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $ ...

  3. <转载>bellman-ford算法

    转载来源:https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 相关文章: 1.Dijkstra算法: http://ww ...

  4. windows下安装Rabbitmq详解

    RabbitMQ是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 1.什么是Erlang? Erlang(['ə:læŋ])是一种通用的面向并发的编程语言 ...

  5. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  6. confluence搭建破解及汉化教程

    注:本文参考了 < confluence搭建破解及汉化教程  > 本文是在yum环境搭建好,且可用联网的前提下进行的实际操作并作记录的. 关于yum本地环境搭建可以参考此文:<Cen ...

  7. 获取表单内的所有元素的值 表单格式化插件jquery.serializeJSON

    简单描述:一个form表单里有十几个input或者select,要获取到他们的值,我的做法一直都是$("#id").val();这样做本来没什么说的,但是如果有很多呢,就很麻烦,看 ...

  8. Synchronized和java.util.concurrent.locks.Lockde区别联系

    1.Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用 ...

  9. 修改jenkins发布账号信息

  10. 如何使用VisualSVN Server建立版本库

    首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要建立版本库,需要右键单击左边窗口的Repositores, ...