Codeforces 739B Alyona and a tree (树上路径倍增及差分)
题目链接 Alyona and a tree
弄了好几个小时终于Accepted了,之后发现这个题是Div1的。
比较考验我思维的一道好题。
首先,做一遍DFS预处理出t[i][j]和d[i][j]。t[i][j]表示从第i个节点到离他第2^j近的祖先,d[i][j]表示从i开始到t[i][j]的路径上的路径权值总和。
在第一次DFS的同时,对节点x进行定位(结果为dist(x, y)<=a(y))的离x最远的x的某个祖先,然后进行O(1)的差分。
第一次DFS完成后,做第二次DFS统计答案(统计差分后的结果)。时间复杂度为O(NlgN)
代码送上。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define REP(i,n) for(int i(0); i < (n); ++i) 6 #define rep(i,a,b) for(int i(a); i <= (b); ++i) 7 #define dec(i,a,b) for(int i(a); i >= (b); --i) 8 #define for_edge(i,x) for(int i = H[x]; i; i = X[i]) 9 10 #define LL long long 11 #define ULL unsigned long long 12 #define MP make_pair 13 #define PB push_back 14 #define FI first 15 #define SE second 16 #define INF 1 << 30 17 #define sz(x) (int)x.size() 18 19 const int N = 200000 + 10; 20 const int M = 10000 + 10; 21 const int Q = 1000 + 10; 22 const int A = 30 + 1; 23 24 25 vector <int> v[N], c[N]; 26 LL a[N], deep[N]; 27 LL x, y; 28 int n, cnt; 29 LL t[N][A], d[N][A]; 30 LL g[N], value[N]; 31 LL s[N]; 32 LL ans[N]; 33 34 void dfs(int x, int fa){ 35 if (g[x]){ 36 t[x][0] = g[x]; 37 d[x][0] = value[x]; 38 for (int i = 0; t[t[x][i]][i]; ++i){ 39 t[x][i + 1] = t[t[x][i]][i]; 40 d[x][i + 1] = d[t[x][i]][i] + d[x][i]; 41 } 42 int now = x, noww = 0; 43 bool flag = false; 44 dec(i, 20, 0){ 45 if (t[now][i] && d[now][i] + noww <= a[x]){ 46 noww += d[now][i]; 47 now = t[now][i]; 48 flag = true; 49 } 50 } 51 if (flag){ 52 --s[g[now]]; ++s[g[x]]; 53 } 54 } 55 56 REP(i, sz(v[x])){ 57 int u = v[x][i]; 58 deep[u] = deep[x] + 1; 59 dfs(u, x); 60 } 61 } 62 63 void dfs2(int x){ 64 ans[x] += s[x]; 65 REP(i, sz(v[x])){ 66 dfs2(v[x][i]); 67 ans[x] += ans[v[x][i]]; 68 } 69 } 70 71 int main(){ 72 73 scanf("%d", &n); 74 rep(i, 1, n) scanf("%lld", a + i); 75 rep(i, 2, n){ 76 scanf("%lld%lld", &x, &y); g[i] = x; value[i] = y; 77 v[x].PB(i), c[x].PB(y); 78 } 79 80 memset(s, 0, sizeof s); 81 cnt = 0; 82 deep[1] = 0; 83 dfs(1, 0); 84 memset(ans, 0, sizeof ans); 85 dfs2(1); 86 rep(i, 1, n - 1) printf("%lld ", ans[i]); 87 printf("%lld\n", ans[n]); 88 89 return 0; 90 91 }
转载于:https://www.cnblogs.com/cxhscst2/p/6352240.html
Codeforces 739B Alyona and a tree (树上路径倍增及差分)相关推荐
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- Alyona and a tree (树上倍增+差分)
题意: 来源(洛谷翻译 题解: 首先先转化一下问题,题目问当前结点(u)的子树中有多少个孩子(设为v)满足dis(u,v)<=a[v],那么我们可以统计每个结点分别对哪些结点做出了贡献. 首先考 ...
- B. Alyona and a tree(dsu on tree + bit)
B. Alyona and a tree(dsu on tree + bit) 给定一颗以111号节点为根的树,每个点有点权aia_iai,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- 树上路径(path)
树上路径(path) 题目描述 在Berland,有n个城堡. 每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且间接隶属于国王. ...
- 原始Radix Tree与路径压缩
原始Radix Tree与路径压缩 Radix Tree简介 Radix tree 是一种前缀字典树,它的主要特点是树的高度不随数据库大小和节点数量改变,而是由 key 的长度决定.B树需要根据数据量 ...
- CodeForces - 1521D Nastia Plays with a Tree(树上最小路径覆盖)
题目链接:点击查看 题目大意:给出一棵树,可以删除 xxx 条边并增加 xxx 条边使得树变为竹子,竹子就是一条链,问 xxx 最小可以为多少,输出一种方案数 题目分析:树上最小路径覆盖,按照子节点个 ...
- CodeForces - 932D Tree(树上倍增,好题)
题目链接:点击查看 题目大意:给出一棵树,初始时只有一个节点1,权值为0,后续有 n 个操作,每次操作分为两种情况: 1 u val:向树中插入一个新的节点,其父节点为 u ,权值为 val 2 u ...
- CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)
http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...
最新文章
- Spark MLlib之使用Breeze操作矩阵向量
- 传播路径可训练的神经网络(云上人二代)
- Alamofire源码解读系列(五)之结果封装(Result)
- pandas 第一行_Pandas进阶,从0到100你还差这篇文章!
- 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?
- Android Studio(7)---从模板添加代码
- 间接寻址级别不同_单片机指令系统与寻址方式
- 为什么电脑插上网线半天才有网,是路由器的的问题吗?
- git21天打卡day11-删除分支
- Silverligth API for ArcGIS应用程序IIS发布
- linux修改yum本地源的方法
- 小小方法,问题锦集。
- 次坐标从0开始_干货 | 全站仪测量使用方法及坐标计算,一步一步讲解!
- 由国内媒体的“非典”报道看信息生态问题-引文
- 关于定时器setTimeout与setInterval的定时与关闭操作
- 原生JS写仿淘宝搜索框(代码+效果),可实现3级搜索哦!
- “裕同集团易普优APS项目启动大会”顺利召开
- 打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>
- 点云数据详解——点云数据变为图像
- 【学习笔记】IP地址块的聚合