HDU 6121 思维 + DFS
来源:互联网 发布:java读取xml文件内容 编辑:程序博客网 时间:2024/05/17 09:27
题目链接
题意:
有一棵n个点的k叉树,标号为0到n-1。求所有子树大小的异或和。
思路:
首先从顶向下进行预处理,得出每一种高度的完全k叉树的各个参量,对于此题我是用三个数组保存:
然后我们可以考虑从当前大规模未知情况向小规模已知情况进行DFS。
考虑任意一个由
对于根节点的
一定有一部分构成了一个高度为
另外有一部分构成了一个高度为
对于这两部分,我们的答案是能够
其中
而此时一定只有一个儿子的子树构成了一个高度为
对于这一部分的答案,细心的话可以发现刚好是当前问题的一个小规模问题,故直接至下而上的搜索即可。
另外对于k=1应该特判,打表找规律即可。
代码:
#include<cstdio>using namespace std;typedef long long ll;const int A = 60 + 5;ll cnt[A],sum[A],Xor[A],n,k;ll F(ll a,ll b){ //返回b个a异或的值 return b&1?a:0;}ll dfs(ll dep,ll add){ //dep:完全k叉树的层数 add:dep层完全k叉树下面的多余节点 if(dep == 0) return 0; return (sum[dep] + add) ^ F(sum[dep],add/cnt[dep]) ^ F(sum[dep-1],k - 1 - add/cnt[dep]) ^ dfs(dep-1,add%cnt[dep]);}ll solve(){ if(k == 1){ // k == 1特判 if(n%4 == 0) return n; if(n%4 == 1) return 1; if(n%4 == 2) return n+1;return 0; } int dep = 1; cnt[dep] = sum[dep] = Xor[dep] = 1; while((n-sum[dep])/k >= cnt[dep]){ //if(所有节点 - 已经用来构成dep层完全k叉树的节点)即剩下的节点还可以继续构成dep+1层完全k叉树 dep++; cnt[dep] = cnt[dep-1]*k; sum[dep] = sum[dep-1] + cnt[dep]; Xor[dep] = sum[dep] ^ F(Xor[dep-1],k); } return dfs(dep,n-sum[dep]);}int main(){ int T;scanf("%d",&T); while(T--){ scanf("%I64d%I64d",&n,&k); printf("%I64d\n",solve()); } return 0;}
阅读全文
1 0
- HDU 6121 思维 + DFS
- HDU 2212 DFS【思维】
- hdu 2212 dfs 简单的思维问题
- hdu 5546 Ancient Go【dfs】【思维】
- HDU-1426(Sudoku Killer)(dfs+巧妙思维)
- HDU 5927 Auxiliary Set dfs(思维)
- HDU 6060 RXD and dividing 思维 + dfs
- -----dfs+思维 hdu 6060-RXD and dividing
- HDU 5952 Counting Cliques dfs + 思维
- hdu 5927 Auxiliary Set dfs+逆向思维
- hdu 6121 分治+思维
- HDU 1145So you want...(概率题目 dfs+思维)
- HDU-1431(素数回文)(思维)(dfs+素数判定)
- HDU 5927 Auxiliary Set(dfs+逆向思维)
- 树上dfs + 思维
- 2017多校第一场 HDU 6044 Limited Permutation 思维,计数,DFS
- 多校第三场 1005 HDU 6060 思维贪心+dfs+一维建树
- 2017多校第4场 HDU 6073 Matching In Multiplication 拓扑排序,思维,DFS
- Python-文件输入和输出
- 傅立叶变换学习(一)初步认识傅立叶变换
- PHP函数stream_context_create()模拟POST/GET
- HDU-Kanade's sum-模拟
- 分享一款Android开源的仿IOS滚轮效果的控件
- HDU 6121 思维 + DFS
- nyoj 18 The Triangle
- 解决引入Dragger2时的等注入依赖报的错: Gradle DSL method not found: 'apt()'
- ClippingNode
- 20170816——Yi+图像算法实习生
- 关于JVM和(堆和栈的区别)
- 文章标题 POJ 3281 : Dining (最大流+巧妙建图)
- Ubuntu 14.04 上使用 Nginx 部署 Laravel
- 使用hadoop对一组数据排序,求平均值。