HDU 6121 Build a tree(完全K叉树)
http://acm.hdu.edu.cn/showproblem.php?pid=6121
题意:
给你一颗完全K叉树,求出每棵子树的节点个数的异或和。
思路:
首先需要了解一些关于完全K叉树或满K叉树的一些知识:

对于每棵子树,只有三种情况:
①是满K叉树 ②不是满K叉树 ③叶子节点
并且非满K叉树最多只有一个,所以只需要将它进行特殊处理,具体看代码吧,说不清楚。代码参考了http://blog.csdn.net/my_sunshine26/article/details/77200282。
当K=1时,树是链状的,需要打表找规律!
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+; ll n, k, ans;
ll num[maxn];
int depth; void init()
{
num[]=;
for(int i=;i<=depth;i++)
{
num[i]=num[i-]+pow((long double)k,(long double)i-); //因为pow默认是pow(int,int),没有对应long long的,所以我这儿用long double来代替了一下
} //当然这里可以自己用快速幂来计算
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&n,&k);
if(k==) //特判
{
ll tmp=n%;
if(tmp==) ans=n;
else if(tmp==) ans=;
else if(tmp==) ans=n+;
else ans=;
printf("%I64d\n",ans);
continue;
} depth=;
ll tmp=n-;
//计算树的深度
while(tmp>)
{
tmp=(tmp-)/k;
depth++;
}
init(); //预处理前i层的节点个数
ans=;
ans^=(n-num[depth-])&; //先处理一下最后一层
depth--;
ll now=; //当前从下往上第几层
ll pos=(n--)/k;
while(depth>)
{
ll left=num[depth-]; //当前层数最左边编号
ll right=num[depth]-; //当前层数最右边编号
ll tmp1=num[now]; //左边树大小
ll tmp2=num[now-]; //右边树大小 //奇数才有贡献
if((pos-left)&) ans^=tmp1;
if((right-pos)&) ans^=tmp2; ll cnt=pos;
while(cnt<=(n--)/k) cnt=cnt*k+;
ans^=(num[now-]+n-cnt); //单独处理临界点子树
now++;
depth--;
pos=(pos-)/k; }
printf("%I64d\n",ans);
}
return ;
}
HDU 6121 Build a tree(完全K叉树)的更多相关文章
- HDU 6121 Build a tree(k叉树的子树大小相异)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目大意: 给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值. 分析: 我们很 ...
- 2017多校第7场 HDU 6121 Build a tree K叉树,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...
- HDU 6121 Build a tree(找规律+模拟)
Build a tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)To ...
- HDU 6121 Build a tree —— 2017 Multi-University Training 7
HazelFan wants to build a rooted tree. The tree has nn nodes labeled 0 to n−1, and the father of the ...
- hdu 6121 Build a tree
/** * 题意:一棵 n 个点的完全 k 叉树,结点标号从 0 到 n - 1,求以每一棵子树的大小的异或和. * 解法:k叉树,当k=1时,特判,用xorn函数,具体解释:http://blog. ...
- 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)
题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...
- 【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree
[链接]点击打开链接 [题意] 询问n个点的完全k叉树,所有子树节点个数的异或总和为多少. [题解] 考虑如下的一棵k=3叉树,假设这棵树恰好有n个节点. 因为满的k叉树,第i层的节点个数为k^(i- ...
- 【最优K叉树】hdu 5884 Sort
http://acm.hdu.edu.cn/showproblem.php?pid=5884 参考:https://www.cnblogs.com/jhz033/p/5879452.html [题意] ...
- 【满k叉树】Perfect Tree
题目描述 Given a positive integer k, we define a rooted tree to be k-perfect, if and only if it meets bo ...
随机推荐
- 网络比总线差多了 除非是真正的mpp并行架构
网络比总线差多了 除非是真正的mpp并行架构 楼方鑫HZproxy里内置一个memory db,可以解决跨库查询中最难的部份.楼方鑫HZ 2015/1/24 21:52:33@joe 用两层DB就好解 ...
- ubuntu 安装ftp nginx tomcat,mysql
tomcat sudo apt-get install tomcat 访问方式,http://loclahost:8080 进入sbin目录下 sudo ./startup.sh开启 sudo ./s ...
- [py][mx]django xadmin后台配置
xadmin配置 - 安装 pip install -r https://github.com/sshwsfc/xadmin/blob/django2/requirements.txt 以下被我测试通 ...
- 顺序结构,判断结构 if,switch
1:顺序结构:从上往下执行程序代码,为顺序结构 ---------------------------------------------------------------------- 2:判断结 ...
- git 生成patch 和打入patch
转载:https://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用gi ...
- Weka——PrincipalComponents分析
package weka.filters.unsupervised.attribute; PrincipalComponents 属性: /** The data to transform analy ...
- python开发中容易犯的错误整合
写在前面 长期更新的博文.多数是一些比较隐蔽的问题.欢迎留言补充. pip并不是那么安逸 pip安装对于开发者来说确实是一种解放.可以自动安装依赖包,但执行最简单的pip安装命令时,并不是所有的依赖都 ...
- innob and myisam存储引擎分析
首次啊对比一下两者的区别: MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义 ...
- 519. Random Flip Matrix(Fisher-Yates洗牌算法)
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n ...
- linux常用命令:shutdown 命令
shutdown以一种安全的方式关闭系统. 1.命令格式: shutdown [参数] [时间] 2.命令功能: 功能: 系统关机命令,shutdown指令可以关闭所有程序,并依用户的需要, ...