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 ...
随机推荐
- MISC-WHCTF2016-crypto100
题目:李二狗的梦中情人 找不同! 如图,下载得到“nvshen.png” 流程:看到这个被命名为nvshen的文件,感觉文件本身会有东西.用16进制查看器在图片的末尾发现了一串类似URL的ASCII ...
- mac 零碎
查看主机名 import socket socket.gethostname() 可以这样安装postgresql 安装postgresql, 输入 brew install postgresql 安 ...
- android studio gradle 国内代理
使用阿里云的国内镜像仓库地址,就可以快速的下载需要的文件 修改项目根目录下的文件 build.gradle : buildscript { repositories { maven{ url 'htt ...
- #C++初学记录(素数判断)
练习题目二 素数判断 A prime number is a natural number which has exactly two distinct natural number divisors ...
- Cup fungus in Corvobado Nation Park,Costa Rica
- springcloud19---springCloudConfig
Spring-cloud-config : 统一管理配置的组件,不同的环境不同的管理(连接池.数据库配置不一样).不同时间需要动态调整配置(双十一最大连接数要大). 分布式配置也可以使用config或 ...
- linux第八周
进程的切换和系统的一般执行过程 一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound)频繁的进行I/O通常会花费很多时间等待I/O操作的完成CPU密集 ...
- shell脚本中多个条件判断的语法
if [ "$content" = "hello" ]\ || [ "$content" = "kitty" ] the ...
- http://www.artrobot.com/北京钢铁侠
http://www.artrobot.com/ 钢铁侠ROS智能机器人 钢铁侠ROS智能机器人 型号 ARTrobot-ROS 产品图片: 产品概述: ARTrobot-ROS全开放机器人套件服 ...
- Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务
1. 概述 bindService() 绑定服务 可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法. 如果调用者activity被销毁了, ...