您的位置:首页 > 其它

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个选择的时候选择右儿子即可。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: