All Your Paths are Different Lengths

题目链接https://atcoder.jp/contests/arc102/tasks/arc102_b


题解

构造题有技巧,如果题目中要求了20和60,那就从这里入手好了。

发现没法入手因为太平凡了....

但是,他要求了每种值只出现了一次,容易联想到弄出来$log$个$2$的幂次。

诶?想到这里发现,$20$好像差不多就是$log$大小。

我们就放$20$个点,第$i$个点指向第$i + 1$个点两条边,$2^{i - 1}$和$0$。

发现不能放20个因为有可能爆,那就放恰好$log$个就好。

接着处理剩下的部分。

其实就是想数位$dp$一样,处理$L$的每个$1$,把当前的$1$变成$0$然后加上前面的所有$1$,看看后面还能有多少连上就好。

诶呀说不明白,看代码吧。

代码

#include <bits/stdc++.h>

#define N 1000010 

using namespace std;

int Log[N];

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )

int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
} int bin[21]; int a[20]; struct Node {
int x, y, z;
}e[100]; int main() {
int n = rd();
n -- ;
bin[0] = 1;
for (int i = 1; i <= 20; i ++ ) {
bin[i] = bin[i - 1] << 1;
}
int k = 0;
int m = n;
bool flag = false;
while (m) {
k ++ ;
if (m % 2 == 0) {
flag = true;
}
m /= 2;
}
int tot = 0;
if (!flag) {
cout << k + 1 << ' ' ;
for (int i = 1; i <= k; i ++ ) {
// i -> i + 1
tot ++ ;
e[tot].x = i, e[tot].y = i + 1, e[tot].z = bin[i - 1];
tot ++ ;
e[tot].x = i, e[tot].y = i + 1, e[tot].z = 0;
}
cout << tot << endl ;
for (int i = 1; i <= tot; i ++ ) {
printf("%d %d %d\n", e[i].x, e[i].y, e[i].z);
}
return 0;
}
// puts("Fuck");
cout << k << ' ' ;
for (int i = 1; i < k; i ++ ) {
tot ++ ;
e[tot].x = i, e[tot].y = i + 1, e[tot].z = bin[k - i - 1];
tot ++ ;
e[tot].x = i, e[tot].y = i + 1, e[tot].z = 0;
}
int cnt = 0;
for (int i = 0; i <= 20; i ++ ) {
if (n & bin[i]) {
a[ ++ cnt] = i;
}
}
int pre = bin[a[cnt]];
for (int i = cnt - 1; i; i -- ) {
tot ++ ;
e[tot].x = 1, e[tot].y = k - a[i], e[tot].z = pre;
pre += bin[a[i]];
}
tot ++ ;
e[tot].x = 1, e[tot].y = k, e[tot].z = n;
cout << tot << endl ;
for (int i = 1; i <= tot; i ++ ) {
printf("%d %d %d\n", e[i].x, e[i].y, e[i].z);
}
return 0;
}

小结:Atcoder全是构造世人皆知.....这个因为都只出现一次,很容易想到二进制。然后数位dp就好了。

[Arc102B]All Your Paths are Different Lengths_构造_二进制拆分的更多相关文章

  1. 量子杨-Baxter方程新解系的一般量子偶构造_爱学术 https://www.ixueshu.com/document/f3385115a33571aa318947a18e7f9386.html

    量子杨-Baxter方程新解系的一般量子偶构造_爱学术 https://www.ixueshu.com/document/f3385115a33571aa318947a18e7f9386.html

  2. AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...

  3. 面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ

    一旦写了一个类,给它3个函数: 1default construtor 2virtual destructor 3copy constructor Constructions vs. assignme ...

  4. Atcoder AGC031C Differ By 1 Bit (构造、二进制)

    哎呀这个C怎么比B还水....(我现在大概也就会做点这种水题了吧) 题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_c 题目大意 符号约定: ...

  5. CF1041E Tree Reconstruction_构造_思维题

    不难发现,每次询问结果一定是 (i,n)(i,n)(i,n), 而 iii 出现的次数恰好是 iii 到 i′i'i′ 的距离(i′i'i′ 是第一个不与 iii 相等的数).我们可以将这颗树构造成一 ...

  6. CF1041F Ray in the tube构造_思维

    不难发现起点必定是一个点. 每次间隔的距离一定是 2k2^k2k,关键就是要判断两点是否在同一跳跃距离上可被同时覆盖. 我们可以对上边进行 x1≡x_{1}\equivx1​≡ x2mod(2∗dx) ...

  7. CF1012B Chemical table 构造_思维_并查集

    我们可以将横坐标和纵坐标看成是点.发现这些点之间是有传递性的. 题中说明,如果有矩阵中三个顶点被选,则底角的点也会被覆盖,发现这些点之间是有传递性的.那么我们最终达到的目的就是使整个图中只有 111 ...

  8. CF #487 (Div. 2) D. A Shade of Moonlight 构造_数形结合

    题意: 给 nnn个长度为 lll 且互不相交的开区间 (xi,xi+l)(x_{i}, x_{i}+l)(xi​,xi​+l) ,每个区间有一个移动速度 vvv,v∈1,−1v∈1,-1v∈1,−1 ...

  9. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题

    题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...

随机推荐

  1. P4317 花神的数论题 动态规划?数位DP

    思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...

  2. git error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

    原因:git 版本过低 解决方法:卸载旧版本,重装新版本

  3. fastJson与jackson性能对比

    转载:https://blog.csdn.net/u013433821/article/details/82905222最近项目用到fastJson和jackson,为了决定到底弃用哪个,随手写了个测 ...

  4. MySQL percona-toolkit工具详解

    一.检查和安装与Perl相关的模块 PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境. 依赖包检查命令为: rpm -qa perl-DBI perl-DBD-MySQL perl ...

  5. [BJWC2008]王之财宝

    嘟嘟嘟 如果没有限制,而且必须选\(m\)件的话,就是隔板法\(C_{n + m - 1} ^ {m - 1}\)了.现在要选至多\(m\)件,那么就相当于新增一个板儿,分出的新的盒子表示" ...

  6. python写爬虫遇到需要解码js一些记录

    js在线格式化网站 https://beautifier.io/ Python 执行 JS 代码 NodeJS 安装方式 先解决 JS 环境,这里推荐安装 Node.js ,安装方便,执行效率也高. ...

  7. struts2方法无法映射问题:There is no Action mapped for namespace [/] and action name [m_hi] associated with context path []

    使用struts的都知道,下面使用通配符定义的方式很常见,并且使用也很方便: <action name="Crud_*" class="example.Crud&q ...

  8. vfork与fork的区别

    vfork()用法与fork()相似,但是也有区别,具体区别归结为以下3点: 1. fork():子进程拷贝父进程的数据段,代码段.vfork():子进程与父进程共享数据段. 2. fork():父子 ...

  9. fiddler 基本知识(一)

    工作原理: fiddler,原理是在本机开启了一个http代理服务器,默认监听127.0.0.1:8888. 打开fiddler之后,会帮我们设置ie代理,虽然只设置了ie,但整个计算机都通过整个代理 ...

  10. csp-s模拟106

    这场其实心态十分爆炸,首先一下午改上次破T3卡常一下午没过,心情十分暴躁.上来开题不顺利,T1想了一个小时没动.于是跳到T2,看T2的80pts貌似可拿就先打了.T3只会判10分,又想打个$2^{2N ...