题意:给1棵N(≤500,000)个节点的树,每条边边权为1,求距离每个点距离不超过K(K≤10)的点的个数的xor和。

思路:由于K很小,可以考虑把距离作为状态的一部分,然后研究父子之间状态的联系。令ans[i][j]表示与i的距离为j的点的个数,那么ans[i][j]由两部分构成,一部分来源于子树,一部分来源于父亲,那么令f[i][j]表示从子树来的答案,g[i][j]表示从父亲来的答案,son(i)表示i的儿子,fa(i)表示i的父亲,则有:

 ans[i][j] = f[i][j] + g[i][j]

f[i][j] = ∑f[son(i)][j-1]

g[i][j] = ans[fa(i)][j-1] - f[i][j-2]

具体做法是:先自底向上求解f数组,这里可以利用队列按拓扑序依次访问每个点,然后自顶向下求g数组,这时只要在上一步的队列里面逆着扫一遍就行了。由于没有递归,速度还是非常快的,把上面的g和ans省掉后,以200ms的速度排到了rank1,小小激动了一下=.=

#include <bits/stdc++.h>
using namespace std;
#ifndef ONLINE_JUDGE
#include "local.h"
#endif #define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
#define all(a) (a).begin(), (a).end()
#define watch(ele) cout << ele << endl;
#define mset(a, x) memset(a, x, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(b))
#define up(a, b) for (int a = 0; a < b; a ++)
#define up1(a, b) for (int a = 1; a <= b; a ++)
#define down1(a, b) for (int a = b; a >= 1; a --)
#define rep(i, a, b) for (int i = a; i <= b; i ++)
#define rrep(i, a, b) for (int i = a; i >= b; i --)
#define down(a, b) for (int a = b - 1; a >= 0; a --)
#define cas() int T, cas = 0; cin >> T; while (T --)
#define printCas(ch) printf("Case #%d:%c", ++ cas, ch) typedef long long ll;
typedef pair<int, int> pii; template<typename T>bool umax(T&a, const T&b){return a<b?(a=b,true):false;}
template<typename T>bool umin(T&a, const T&b){return b<a?(a=b,true):false;} const int N = 5e5 + 7; int n, k, a, b;
int din[N], fa[N], f[N][11]; void getData() {
mset(din, 0);
fa[1] = 0;
rep(i, 2, n) {
int f = ((ll)a * i + b) % (i - 1) + 1;
din[f] ++;
fa[i] = f;
}
}
int Q[N], head, tail;
void work() {
head = tail = 0;
mset(f, 0);
up1(i, n) if (din[i] == 0) Q[tail ++] = i;
up1(i, n) f[i][0] = 1;
while (head < tail) {
int node = Q[head ++];
up(i, k) f[fa[node]][i + 1] += f[node][i];
if (-- din[fa[node]] == 0) Q[tail ++] = fa[node];
}
int apple = 0;
rrep(i, tail - 1, 0) {
int node = Q[i];
if (fa[node]) rrep(j, k, 1) f[node][j] += f[fa[node]][j - 1] - (j >= 2?f[node][j - 2] : 0);
int buf = 0;
rep(j, 0, k) buf += f[node][j];
apple ^= buf;
}
cout << apple << endl;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
cas() {
cin >> n >> k >> a >> b;
getData();
work();
}
return 0;
}

  

[hdu5593 ZYB's Tree] 树上统计的更多相关文章

  1. hdu5593/ZYB's Tree 树形dp

    ZYB's Tree    Memory Limit: 131072/131072 K (Java/Others) 问题描述 ZYBZYB有一颗NN个节点的树,现在他希望你对于每一个点,求出离每个点距 ...

  2. HDU5593 ZYB's Tree 树形DP +分治

    感觉其实就是树分治,一次BC的题,感觉这次题目质量比较高,仅代表蒟蒻的看法 一次DFS获取每个点到子树的距离不大于K的点的个数, 然后一遍BFS获取从每个点父亲不大于K的的个数,层层扩展,还是想说 其 ...

  3. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  4. HUD 5593——ZYB's Tree——————【树形dp】

    ZYB's Tree Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  5. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  6. NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...

  7. Luogu P2664 树上游戏 dfs+树上统计

    题目: P2664 树上游戏 分析: 本来是练习点分治的时候看到了这道题.无意中发现题解中有一种方法可以O(N)解决这道题,就去膜拜了一下. 这个方法是,假如对于某一种颜色,将所有这种颜色的点全部删去 ...

  8. [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问

    [BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...

  9. [SDFZOJ]1069:树上统计

    神题...std丑的不行. 我们可以发现i->i+1的边被覆盖过i×(n-i)次. 因为以1->i为左端点,以i+1->n的为右端点,i->i+1都将被覆盖这么多次. 然后从1 ...

随机推荐

  1. 搭建Ubuntu虚拟机

    搭建Ubuntu虚拟机 前言 1. 啰嗦一下 1.1 ubuntu虚拟机的作用 1.2 为什么选择Ubuntu 1.3 工具准备 2. 正式开始 2.1 安装VMware 2.2 创建Ubuntu虚拟 ...

  2. 适合新手练习的Python项目有哪些?Python爬虫用什么框架比较好?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. Python爬虫一般用什么框架比较好?一般来讲,只有在遇到比较大型的需求时 ...

  3. java面试题(一年工作经验)的心得

    看面试题 正常人第一步肯定都会看面试题,我也不例外,在看的过程中,我发现有些文章写的不错,对我帮助不小值得推荐,如下: Java面试题全集(上) 很多基础的东西,建议先看. 各大公司Java后端开发面 ...

  4. [git] github 推送以及冲突的解决,以及一些命令

    推送以及冲突的解决:(我的觉得先看完) (正常情况就是把修改的文件 git add 然后git commit 然后推送就行啦): 下面是一些命令 1.查看分支状态(查看所有:当前检出分支的前面会有星号 ...

  5. python入门学习之Python爬取最新笔趣阁小说

    Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...

  6. php下载各种编辑器输出的内容到word中展示

    <?php/** * Created by PhpStorm. * User: 工作 * Date: 2018/1/11 * Time: 12:02 */ //连接数据库$dsn = " ...

  7. mysql硬件优化

    导致宕机的原因: 1.      运行环境: 35%,运行环境可以看做是支持数据库服务器运行的系统和资源集合,包括操作系统,硬盘以及网络 2.      性能:35% 3.      复制 20% 4 ...

  8. servlet温故知新

    重新学习了一遍servlet-api的文档,做一些记录. 有道云的笔记直接复制到博客上格式会乱,因此直接放上有道云的链接:http://note.youdao.com/noteshare?id=915 ...

  9. BurpSuite 扩展开发[1]-API与HelloWold

    园长 · 2014/11/20 15:08 0x00 简介 BurpSuite神器这些年非常的受大家欢迎,在国庆期间解了下Burp相关开发并写了这篇笔记.希望和大家分享一下JavaSwing和Burp ...

  10. 一只简单的网络爬虫(基于linux C/C++)————利用正则表达式解析页面

    我们向一个HTTP的服务器发送HTTP的请求后,服务器会返回可能一个HTML页面(当然也可以是其他的资源),我们可以利用返回的HTML页面,在其中寻找其他的Url,例如我们可以这样在浏览器上查看一下H ...