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 ...
随机推荐
- XMind思维导图自定义图标/图片
- bootstrap模态框手动开启关闭与设置点击外部不关闭
http://www.cnblogs.com/qlqwjy/p/7491054.html 完整的参考菜鸟教程:http://www.runoob.com/bootstrap/bootstrap-mod ...
- 8款世界级Webmail工具推荐
Webmail软件或者基于Web的电子邮件包含两个重要方面:Webmail客户端和Webmail提供商.Webmail客户端负责通过本地或远程服务器使用POP3和SMTP协议发送和接收电子邮件.Web ...
- 转载的 Linux下chkconfig命令详解
Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...
- Git—使用方法
1.:插件的安装(eclipse LUNA版本之后已经自动集成,不需要安装插件). * 先打开该网页提供了对应版本的EGit,自己选择相应的版本.(http://wiki.eclipse.org/EG ...
- redis和memcached相关
应该选择哪一种缓存机制 redis相较于memcached更加年轻,功能更加强大. 对小型静态数据进行缓存处理,最具代表性的例子就是HTML代码片段.使用memcached所消耗内存更少. 其他情况下 ...
- ajax提交form(文本数据以及文件上传)
$.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...
- memecached常用命令
memcached 常用命令及使用说明 1.启动Memcache 常用参数 -p <num> 设置TCP端口号(默认设置为: 11211) -U <num> UDP监听端口(默 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON SetComprise2
zw版[转发·台湾nvp系列Delphi例程]HALCON SetComprise2 procedure TForm1.Button1Click(Sender: TObject);var op : H ...
- python插入排序算法总结
插入排序算法总结: 插入算法的核心是 每次循环到一个数时,都认为这个数之前的数列都是排好序的,将一个数插入到已经排好序的有序数列中,从而得到一个新的.个数加一的有序数列. 过程:从第一个元素开始,第一 ...