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. jQuery.extend([deep], target, object1, [objectN])

    jQuery.extend([deep], target, object1, [objectN]) 概述 用一个或多个其他对象来扩展一个对象,返回被扩展的对象.直线电机 如果不指定target,则给j ...

  2. Shell 06 awk

    一.基本操作方法 ######################################### grep 按行进行查找 vim  编辑文档,交互式 ####################### ...

  3. Gym - 101955K Let the Flames Begin 约瑟夫环

    Gym - 101955KLet the Flames Begin  说实话,没怎么搞懂,直接挂两博客. 小飞_Xiaofei的约瑟夫问题(Josephus Problem)3:谁最后一个出列 小飞_ ...

  4. Codeforces 1272 A-E

    Codeforces 1272 A-E A Three Friends 直接枚举所有情况,共\(3\times 3\times 3=27\)种. code #include<bits/stdc+ ...

  5. php安装扩展的地址

    1 查看扩展 phpinfo  or extention_loads  or php -m 下载扩展地址 http://pecl.php.net     or http://windows.php.n ...

  6. Django基础之form表单的补充进阶

    1. 应用Bootstrap样式 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  7. League of Leesins

    C - League of Leesins 首先找到每一串数字的头和尾两个数字,这两个数字有一个特点,就是它们在输入数据的时候都只会出现一次.我们在输出的时候用头和尾做第一数都可以. 然后第二个数只会 ...

  8. Flask 生成下载文件

    1 后台程序直接生成文件内容 from flask import make_response @app.route('/testdownload', methods=['GET']) def test ...

  9. 使用PyMySQL连接MySQL错误

    使用PyMySQL连接MySQL错误 之前写了一个小项目,今天突然想起来,准备优化一下,但是原本好好的项目竟然跑不起来了 emmm....我真的啥都没干呀 具体错误是这样的: Traceback (m ...

  10. Spring事务知识点

    事务的传播属性 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.// 最常用,@Transactional注解默认 PROPAGA ...