[hdu5593 ZYB's Tree] 树上统计
题意:给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] 树上统计的更多相关文章
- hdu5593/ZYB's Tree 树形dp
ZYB's Tree Memory Limit: 131072/131072 K (Java/Others) 问题描述 ZYBZYB有一颗NN个节点的树,现在他希望你对于每一个点,求出离每个点距 ...
- HDU5593 ZYB's Tree 树形DP +分治
感觉其实就是树分治,一次BC的题,感觉这次题目质量比较高,仅代表蒟蒻的看法 一次DFS获取每个点到子树的距离不大于K的点的个数, 然后一遍BFS获取从每个点父亲不大于K的的个数,层层扩展,还是想说 其 ...
- [洛谷U40581]树上统计treecnt
[洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...
- HUD 5593——ZYB's Tree——————【树形dp】
ZYB's Tree Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...
- Luogu P2664 树上游戏 dfs+树上统计
题目: P2664 树上游戏 分析: 本来是练习点分治的时候看到了这道题.无意中发现题解中有一种方法可以O(N)解决这道题,就去膜拜了一下. 这个方法是,假如对于某一种颜色,将所有这种颜色的点全部删去 ...
- [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问
[BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...
- [SDFZOJ]1069:树上统计
神题...std丑的不行. 我们可以发现i->i+1的边被覆盖过i×(n-i)次. 因为以1->i为左端点,以i+1->n的为右端点,i->i+1都将被覆盖这么多次. 然后从1 ...
随机推荐
- HTTP Request和Response
一.Servlet 1:实现Servlet接口 servlet生命周期: init方法:tomcat启动时 调用此方法 service方法:访问servlet时默认执行此方法 destroy方法:to ...
- position的用法(top, bottom, left, right 四个定位属性配合进行使用)
一般情况下 页面元素的定位方式是根据文档流也就是说默认的从上到下,从左到右的方式进行排列的,而将元素从文档流脱离出来显示的方式有两种,一种是 position 定位另一种是float 浮动,这里我们详 ...
- kubernetes的headless service介绍
headless service是一个特殊的ClusterIP类service,这种service创建时不指定clusterIP(--cluster-ip=None),因为这点,kube-proxy不 ...
- 基于TextRank算法的文本摘要
本文介绍TextRank算法及其在多篇单领域文本数据中抽取句子组成摘要中的应用. TextRank 算法是一种用于文本的基于图的排序算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之 ...
- Java中BigDecimal类
由于在运算的时候,float类型和double很容易丢失精度,演示案例,所以,为了能精确地表示.计算浮点数,Java提供了BIgDecimal BigDecimal类的概述 不可变的.任意精度的有符号 ...
- ElasticSearch的高级复杂查询:非聚合查询和聚合查询
一.非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程) 查询条件QueryBuilder的构建方法 1.1 精确查询(必须完全匹配上,相当于SQL语句中的“=”) ① 单个匹配 termQuery ...
- python学习10字典
'''''''''字典(Dict)是python语言的一个最大的特征1.定义:是可变的无序集合,以键值对为基本元素,可以存储各种数据类型2.表示:{} 列表:[] 元组 () 字符串 ‘’ “” ‘‘ ...
- WANNACRY病毒中的加密技术分析
WANNACRY病毒中的加密技术分析 2019/11/6 16:56:46 分析WANNACRY病毒中的加解密技术的应用.分析内容包括但不限于:对称密码技术和公钥密码技术的作用:受害者支付赎金后就会恢 ...
- @SessionAttributes 和 @SessionAttribute的区别
@SessionAttributes 和 @SessionAttribute的区别 Spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttrib ...
- IBM:向所有云平台开放Watson人工智能系统
据美国科技媒体TechCrunch报道,IBM今天宣布不再把沃森(Watson)品牌的人工智能服务局限于自家云计算服务,而是会允许其他企业在自己的数据中心里使用和运行这个平台."客户很难把人 ...