[Arc102B]All Your Paths are Different Lengths_构造_二进制拆分
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_构造_二进制拆分的更多相关文章
- 量子杨-Baxter方程新解系的一般量子偶构造_爱学术 https://www.ixueshu.com/document/f3385115a33571aa318947a18e7f9386.html
量子杨-Baxter方程新解系的一般量子偶构造_爱学术 https://www.ixueshu.com/document/f3385115a33571aa318947a18e7f9386.html
- AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...
- 面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ
一旦写了一个类,给它3个函数: 1default construtor 2virtual destructor 3copy constructor Constructions vs. assignme ...
- Atcoder AGC031C Differ By 1 Bit (构造、二进制)
哎呀这个C怎么比B还水....(我现在大概也就会做点这种水题了吧) 题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_c 题目大意 符号约定: ...
- CF1041E Tree Reconstruction_构造_思维题
不难发现,每次询问结果一定是 (i,n)(i,n)(i,n), 而 iii 出现的次数恰好是 iii 到 i′i'i′ 的距离(i′i'i′ 是第一个不与 iii 相等的数).我们可以将这颗树构造成一 ...
- CF1041F Ray in the tube构造_思维
不难发现起点必定是一个点. 每次间隔的距离一定是 2k2^k2k,关键就是要判断两点是否在同一跳跃距离上可被同时覆盖. 我们可以对上边进行 x1≡x_{1}\equivx1≡ x2mod(2∗dx) ...
- CF1012B Chemical table 构造_思维_并查集
我们可以将横坐标和纵坐标看成是点.发现这些点之间是有传递性的. 题中说明,如果有矩阵中三个顶点被选,则底角的点也会被覆盖,发现这些点之间是有传递性的.那么我们最终达到的目的就是使整个图中只有 111 ...
- 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 ...
- Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...
随机推荐
- sql server 函数学习
sql server 创建函数 资料 https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/ ...
- number-progression-network
T1给定一个 $n$ 位的数字串,要求修改若干位,使得至少包含 $k$ 个相同的数位,最小化代价. Sol 考虑枚举那种数字作为答案,选代价前 $k$ 小的修改成目标数字. 有一部分的数字是必须修改的 ...
- bus error(总线错误)
转自 http://blog.csdn.net/todd911/article/details/8813321 在<C专家编程>中提到了总线错误bus error(core dumped) ...
- 线程的分离状态 detached joinable
转自 http://blog.chinaunix.net/uid-26983585-id-3315953.html 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的 ...
- 2019.6.28 校内测试 T2 【音乐会】二重变革
看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...
- idea 2018注册码(激活码)
最近做一个项目,用idea 社区版的 但是缺少了好多功能 无奈只能用专业版的,但是需要注册激活 下面是我的注册方法 1.打开了idea 会提示让激活 选择Licensse server 2. ...
- 数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别
1.脏读 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据. 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的 ...
- ubuntu mysql 的安装、配置、简单使用,navicat 连接
MySQL 的安装 1. 先更新 apt 安装中心: apt update 里面会有默认最新的mysql 的包. 2.安装msyql : sudo apt-get install mysql-serv ...
- 执行git pull时提示Connection reset by 13.229.188.59 port 22
问题如下图: 解决办法: 1. 2. 3. 4. 5. 6.
- springboot 整合缓存(Ehcache或者reids)
这里介绍Spring Boot结合JPA,MySQL和Ehcache实现缓存功能,提高程序访问效率. 一.Maven依赖 <!-- caching --> <dependency&g ...