Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)
题意:
给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值
思路:
O(n)DFS一遍即可,既然只用最后输出答案,果断离线,存下每个点的所有操作
设deep[x]为x点的深度
- 当第一次DFS到点v时,将深度在deep[v]到deep[v+d]的点权值全部加上x
- 当搜完点v所有的子孙准备回溯时,将深度在deep[v]到deep[v+d]的点权值全部减去x
- 这样每次搜到点v,当前深度的总权值就是答案
以上可以用BIT解决,当然也可以直接差分
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
typedef struct Res
{LL val;int dep;
}Res;
Res s[300005];
vector<int> G[300505];
vector<Res> F[300505];
int n;
LL ans[300505], out[300505];
void Sech(int u, int p, int deep, LL val)
{Res now;int i, v;for(i=0;i<F[u].size();i++){now = F[u][i];out[deep] += now.val, out[min(deep+now.dep+1, n+5)] -= now.val;}val += out[deep];//printf("%d %d %lld %lld\n", u, deep, out[deep], val);ans[u] = val;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Sech(v, u, deep+1, val);}for(i=0;i<F[u].size();i++){now = F[u][i];out[deep] -= now.val, out[min(deep+now.dep+1, n+5)] += now.val;}
}
int main(void)
{Res now;int m, i, x, y;scanf("%d", &n);for(i=1;i<=n-1;i++){scanf("%d%d", &x, &y);G[x].push_back(y);G[y].push_back(x);}scanf("%d", &m);for(i=1;i<=m;i++){scanf("%d%d%lld", &x, &y, &now.val);now.dep = y;F[x].push_back(now);}Sech(1, 0, 1, 0ll);for(i=1;i<=n;i++)printf("%lld ", ans[i]);puts("");return 0;
}
Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)相关推荐
- Educational Codeforces Round 54 (Rated for Div.2)
Educational Codeforces Round 54 (Rated for Div.2) D. Edge Deletion 题意:一张n个点的无向图,保留其中k条边,使得有尽可能多的点与1的 ...
- Educational Codeforces Round 54 (Rated for Div. 2) D Edge Deletion (SPFA + bfs)
题目大意:给定你一个包含n个点m条边的无向图,现在最多在图中保留k条边,问怎么删除多的边,使得图中良好的节点数最多,求出保留在图中的边的数量和编号. 良好的节点定义为:删除某条边后该点到点1的最短距离 ...
- Educational Codeforces Round 54 (Rated for Div. 2): D. Edge Deletion(最短路树)
题意: 给你n个点m条边的无向图,其中1号节点是市中心,你现在最多只能保留k条边,并要求所有点到市中心的最短路尽量不变(也就是说设点i到点1的最短路为di,那么删边之后,要保证尽可能多的点,它到1的最 ...
- Codeforces Educational Codeforces Round 56 (Rated for Div. 2) 1093F. Vasya and Array
有一个长度为nnn的的数列,aia_iai的值域只有kkk个元素. 一个数列有一些数字已经填上.现在要求数列连续的数字长度不能超过lll,问所有不同的数列的个数有多少个. 1.考虑所有的数字都没填上 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)
Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...
最新文章
- 配置web site 在IIS 6.0
- 深入理解分布式技术 - 两阶段的应用 MySQL XA 规范
- c++新特性11 (9)智能指针一”_Compressed_pair类“
- 回调地狱解决方案之Promise
- 学习编程技术常见的疑问,你敢说你没有过一个吗?信你个鬼!
- linux脚本 sed,Linux脚本利器sed
- 3-5比较和Fancy Indexing
- 【AI面试题】GBDT原理、如何用于分类、常用损失函数
- 逐句深扒 Apache 许可协议原文,一文看懂!
- 浅谈MySQL存储引擎选择 InnoDB还是MyISAM
- Vue实例-本地留言板
- Java-API:java.util.ArrayList
- L1-041__048
- 模电七:集成运算放大器(上)
- 独立站开发优化问题?
- sunShine问题
- java科学计算器代码_用JAVA编写的科学计算器源代码是什么?
- 计算机主机箱背后的接口,计算机主机背面有哪些接口
- 计算机网络的基础学习
- mobi文件怎么打开?
热门文章
- python入门经典100题-Python3基础训练经典100题(带答案)下载
- 微信终于良心一回,更新了语音识别功能可识别粤语,广东人有福了
- 玩人工智能的你必须知道的语音识别技术原理
- Vue-Cli3配置多页面应用(详)
- JavaScript-预解析(变量提升)
- css3 first letter,::first-letter
- mysql nb3 备份_Navicat mysql 数据库备份和使用,备份以后是nb3文件-Go语言中文社区...
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- java 时间戳验证_关于Java:在时间戳服务器上使用时间戳和身份验证对jar进行签名...
- element 输入框点击事件_Element Input输入框的使用方法