CF1076E:Vasya and a Tree(DFS&差分)
Vasya has a tree consisting of n n vertices with root in vertex 1 1 . At first all vertices has 0 0 written on it.
Let d(i,j) d(i,j) be the distance between vertices i i and j j , i.e. number of edges in the shortest path from i i to j j . Also, let's denote k k -subtree of vertex x x — set of vertices y y such that next two conditions are met:
- x x is the ancestor of y y (each vertex is the ancestor of itself);
- d(x,y)≤k d(x,y)≤k .
Vasya needs you to process m m queries. The i i -th query is a triple v i vi , d i di and x i xi . For each query Vasya adds value x i xi to each vertex from d i di -subtree of v i vi .
Report to Vasya all values, written on vertices of the tree after processing all queries.
Input
The first line contains single integer n n (1≤n≤3⋅10 5 1≤n≤3⋅105 ) — number of vertices in the tree.
Each of next n−1 n−1 lines contains two integers x x and y y (1≤x,y≤n 1≤x,y≤n ) — edge between vertices x x and y y . It is guarantied that given graph is a tree.
Next line contains single integer m m (1≤m≤3⋅10 5 1≤m≤3⋅105 ) — number of queries.
Each of next m m lines contains three integers v i vi , d i di , x i xi (1≤v i ≤n 1≤vi≤n , 0≤d i ≤10 9 0≤di≤109 , 1≤x i ≤10 9 1≤xi≤109 ) — description of the i i -th query.
Output
Print n n integers. The i i -th integers is the value, written in the i i -th vertex after processing all queries.
Examples
5
1 2
1 3
2 4
2 5
3
1 1 1
2 0 10
4 10 100
1 11 1 100 0
5
2 3
2 1
5 4
3 4
5
2 0 4
3 10 1
1 2 3
2 3 10
1 1 7
10 24 14 11 11
Note
In the first exapmle initial values in vertices are 0,0,0,0,0 0,0,0,0,0 . After the first query values will be equal to 1,1,1,0,0 1,1,1,0,0 . After the second query values will be equal to 1,11,1,0,0 1,11,1,0,0 . After the third query values will be equal to 1,11,1,100,0 1,11,1,100,0
题意:给定一棵大小为N个树,Q次操作,每次给出三元组(u,d,x)表示给u为根的子树,距离u不超过d的点加值x。
思路:对于每个操作,我们在u处加x,在dep[u+d+1]处减去x。只需要传递一个数组,代表在深度为多少的时候减去多少即可,由于是DFS,满足操作都是在子树里的。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
int dep[maxn],N,Laxt[maxn],Next[maxn],To[maxn],cnt;
int laxt2[maxn],next2[maxn],D[maxn],X[maxn],tot; ll ans[maxn];
void add(int u,int v){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
}
void add2(int u,int d,int x){
next2[++tot]=laxt2[u]; laxt2[u]=tot; D[tot]=d; X[tot]=x;
}
void dfs(int u,int f,ll sum,ll *mp)
{
dep[u]=dep[f]+; sum-=mp[dep[u]];
for(int i=laxt2[u];i;i=next2[i]){
sum+=X[i];if(dep[u]+D[i]+<=N) mp[dep[u]+D[i]+]+=X[i];
}
ans[u]=sum;
for(int i=Laxt[u];i;i=Next[i])
if(To[i]!=f) dfs(To[i],u,sum,mp);
for(int i=laxt2[u];i;i=next2[i]){
sum-=X[i];if(dep[u]+D[i]+<=N) mp[dep[u]+D[i]+]-=X[i];
}
}
ll mp[maxn];
int main()
{
int u,v,x,Q; scanf("%d",&N);
rep(i,,N-) {
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
scanf("%d",&Q);
rep(i,,Q) {
scanf("%d%d%d",&u,&v,&x);
add2(u,v,x);
} dfs(,,0LL,mp);
rep(i,,N) printf("%lld ",ans[i]);
return ;
}
CF1076E:Vasya and a Tree(DFS&差分)的更多相关文章
- CF Edu54 E. Vasya and a Tree DFS+树状数组
Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...
- Educational Codeforces Round 54 E. Vasya and a Tree(树上差分数组)
https://codeforces.com/contest/1076/problem/E 题意 给一棵树(n<=3e5),m(3e5)次查询,每次查询u,d,x,表示在u的子树中,给距离u&l ...
- cf1076E Vasya and a Tree (线段树)
我的做法: 给询问按$deep[v]+d$排序,每次做到某一深度的时候,先给这个深度所有点的值清0,然后直接改v的子树 官方做法比较妙妙: dfs,进入v的时候给$[deep[v],deep[v]+d ...
- [CF1076E]Vasya and a Tree
题目大意:给定一棵以$1$为根的树,$m$次操作,第$i$次为对以$v_i$为根的深度小于等于$d_i$的子树的所有节点权值加$x_i$.最后输出每个节点的值 题解:可以把操作离线,每次开始遍历到一个 ...
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces1076E. Vasya and a Tree(dfs+离线+动态维护前缀和)
题目链接:传送门 题目: E. Vasya and a Tree time limit per test seconds memory limit per test megabytes input s ...
- Vasya and a Tree CodeForces - 1076E (线段树 + dfs)
题面 Vasya has a tree consisting of n vertices with root in vertex 1. At first all vertices has 0 writ ...
- CodeForces-1076E Vasya and a Tree
CodeForces - 1076E Problem Description: Vasya has a tree consisting of n vertices with root in verte ...
- Codeforces 1076 E - Vasya and a Tree
E - Vasya and a Tree 思路: dfs动态维护关于深度树状数组 返回时将当前节点的所有操作删除就能保证每次访问这个节点时只进行过根节点到当前节点这条路径上的操作 代码: #pragm ...
随机推荐
- 使用scikit-learn 估计器分类
本章的几个概念: 估计器(estimator) 用于分类.聚类和回归分析 转换器(transformer):用于数据预处理回来数据转换 流水线(pipeline): ...
- SLG手游Java服务器的设计与开发——网络通信
文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文分析了我们这款SLG的架构,本章着重讲解我们的网络通信架构,由上文的功能分析我们可以得知,游戏的所有功能基本上属于非 ...
- 禁止复制操作 --《C++必知必会》条款32
class NoCopy{ private: //声明为私有的,则外部不可访问,即:不可复制 NoCopy(const NoCopy & );//复制构造函数 NoCopy & ope ...
- 测试人必备:国内外最好用的6款Bug跟踪管理系统
在移动互联网产品中,Bug会导致软件产品在某种程度上不能满足用户的需要.确保一个项目进展顺利,关键在于妥善处理软件中的BUG,那么,如何高效的管理BUG,解决BUG?在这里,我为大家搜集了几款优秀的B ...
- 11Qt样式表
Qt样式表 Qt样式表的思想很大程度上是来自原HTML的层叠式样式表(CSS),通过调用Qwdiget::setStyleSheet()或是Qapplication::setStyleSheet(), ...
- 《高性能CUDA应用设计与开发》--笔记
第一章 1.2 CUDA支持C与C++两种编程语言,该书中的实例采取的是Thrust数据并行API,.cu作为CUDA源代码文件,其中编译器为ncvv. 1.3 CUDA提供多种API: 数据并行 ...
- jQuery源码分析--Event模块(2)
接下来就是触发事件了.事件触发后的处理函数的分发主要靠两个函数,一个jQuery.event.dispatch,一个是jQuery.event.handlers.这个dispatch会调用handle ...
- 网络安全、Web安全、渗透测试之笔经面经总结(一)
本篇文章总结涉及以下几个方面: 对称加密非对称加密? 什么是同源策略? cookie存在哪里?可以打开吗 xss如何盗取cookie? tcp.udp的区别及tcp三次握手,syn攻击? 证书要考哪些 ...
- 安装Git【转】
本文转载自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 最早Git是在Linu ...
- luogu P1025 数的划分
https://www.luogu.org/problem/show?pid=1025 n的k划分 且不出现划分成0的情况 可以 分为两种情况 所有划分的数 都大于1的情况 至少划分的数里面有1的情 ...