HDU 5573B Binary Tree(思维)
2017-10-25 15:27
549 查看
题意:给你一棵无穷的满二叉树,标号1,2,3,4,…。现在给你一个n,k(n≤1e9,k≤60,n≤2k),问你能否在这颗树上从根开始往下走,一共k步,增加/减少这些结点的标号的价值,使得最终答案为n。
思路:构造。易知1+2+22+⋯+2k−1,由k个数可以组成1−2k−1内的任何奇数,构造方法就是delta = (2k−1−n)/2。把delta对应位上置成负号,其他均为正号即可,偶数的话只需要在第k个选择的时候选择右儿子即可。
思路:构造。易知1+2+22+⋯+2k−1,由k个数可以组成1−2k−1内的任何奇数,构造方法就是delta = (2k−1−n)/2。把delta对应位上置成负号,其他均为正号即可,偶数的话只需要在第k个选择的时候选择右儿子即可。
#include <bits/stdc++.h> using namespace std; int vis[100]; int main() { int T; scanf("%d", &T); for(int cas = 1; cas <= T; cas++) { long long n, k; scanf("%lld%lld", &n, &k); int flag = 0; if(n % 2 == 0) flag = 1, n--; long long sum = (1LL << k) - 1; long long delta = abs(sum - n); delta = delta / 2; memset(vis, 0, sizeof(vis)); for(int i = k - 1; i >= 0; i--) { if((delta >> i) & 1) vis[i] = -1; } printf("Case #%d:\n", cas); for(int i = 0; i <= k - 1; i++) { int d = 0; if(i == k - 1 && flag) d = 1; printf("%lld %c\n", (1LL << i) + d, vis[i] == 0 ? '+' : '-'); } } return 0; }
相关文章推荐
- 从终点出发的思维(博弈论的诡计)
- Codeforces 582B Once Again...【思维YY+Dp(LIS)】好题~
- 积极打破消极思维模式
- [CF355C]Vasya and Robot(思维,贪心)
- 原来我还可以这样活:拆掉思维里的墙
- Codeforces Round #381 (Div. 2) C. Alyona and mex(思维)
- 谈某些程序员顽固的思维方式
- Codeforces Round #381 (Div. 2)C(构造,思维)
- 75道逻辑思维题(无聊时看看,锻炼思维也不错)(一)
- CodeForces 735A - Ostap and Grasshopper(思维)
- 跳出思维的怪圈
- <<AngularJS>>思维模式
- 汉英语言文字与中英思维方式
- CodeForces 66A - Petya and Java(思维)
- 软件开发中的11个系统思维定律
- Codeforces Round #383 (Div. 2)C.Arpa's loud Owf and Mehrdad's evil plan【思维+LCM】
- 思维工具1: SCAMPER
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
- IT项目管理的六种错误思维
- 这种吊炸天的思维方式,你早该知道的!