题意:一棵树有n个节点,1是根节点,根节点的子节点是单链,然后如今有两种操作0 v x d表示距离节点v为d的节点权值都加x,操作1 v问v节点的权值,初始节点权值都是0。

题解:看了别人的题解才会的,维护两种树,把每条单链都当做一个树状数组维护当前链上每一个节点的权值,还有一种是从根节点開始维护距离为x的节点的权值。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;
const int N = 100005;
int n, q, dis[N], root[N];//数组存深度和单链头节点
vector<int> g[N];
vector<vector<ll> > C; int lowbit(int x) {
return x & (-x);
}
//对于根节点的树。en代表距离根节点的长度,假设等于0就不加,由于变量sum加过了
//对于单链的树,st到en向下延伸
void Add(int st, int en, int val, int cur) {
if (st > en)
return;
int sz = C[cur].size();
for (int i = st; i < sz; i += lowbit(i))
C[cur][i] += val;
for (int i = en + 1; i < sz; i += lowbit(i))
C[cur][i] -= val;
} ll Sum(int deep, int cur) {
ll ret = 0;
int sz = C[cur].size();
for (int i = deep; i > 0; i -= lowbit(i))
ret += C[cur][i];
return ret;
} void dfs(int u, int pre, int cnt, int cur) {
dis[u] = cnt;
root[u] = cur;
C[cur].push_back(0);
int sz = g[u].size();
for (int i = 0; i < sz; i++) {
int v = g[u][i];
if (v != pre)
dfs(v, u, cnt + 1, cur);
}
} int main() {
scanf("%d%d", &n, &q);
for (int i = 0; i <= n; i++)
g[i].clear();
int a, b, op, l, r, x, v, d;
for (int i = 1; i < n; i++) {
scanf("%d%d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
int sz = g[1].size();
C.resize(sz + 5);
for (int i = 0; i < sz; i++) {
C[i + 1].push_back(0);//根节点
dfs(g[1][i], 1, 1, i + 1);
}
C[0].resize(N, 0);
ll sum = 0;//根节点1的权值
while (q--) {
scanf("%d", &op);
if (op == 0) {
scanf("%d%d%d", &v, &x, &d);
int cur = root[v];
if (d < dis[v])//不会延伸到其它链
Add(dis[v] - d, dis[v] + d, x, cur);
else {
sum += x;
Add(1, dis[v] + d, x, cur);//单链的子节点延伸
Add(1, d - dis[v], x, 0);//向根节点延伸
Add(1, d - dis[v], -x, cur);//反复加的减掉
}
}
else {
scanf("%d", &v);
if (v == 1)
printf("%lld\n", sum);
else {
int cur = root[v];
printf("%lld\n", Sum(dis[v], cur) + Sum(dis[v], 0));//向根节点延伸的单链上的和加上根节点向下延伸的加上的权值
}
}
}
return 0;
}

Codeforces 276E(树状数组)的更多相关文章

  1. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  2. codeforces 341d (树状数组)

    problem Iahub and Xors 题目大意 一个n*n的矩阵,要求支持两种操作. 操作1:将一个子矩阵的所有值异或某个数. 操作2:询问某个子矩阵的所以值的异或和. 解题分析 由于异或的特 ...

  3. CodeForces 396C 树状数组 + DFS

    本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...

  4. Tokitsukaze and Strange Rectangle CodeForces - 1191F (树状数组,计数)

    大意: 给定$n$个平面点, 定义集合$S(l,r,a)$表示横坐标$[l,r]$纵坐标$[a,\infty]$内的所有点. 求可以得到多少种不同的集合. 从上往下枚举底层最右侧点, 树状数组统计贡献 ...

  5. codeforces 629D 树状数组+LIS

    题意:n个圆柱形蛋糕,给你半径 r 和高度 h,一个蛋糕只能放在一个体积比它小而且序号小于它的蛋糕上面,问你这样形成的上升序列中,体积和最大是多少 分析:根据他们的体积进行离散化,然后建树状数组,按照 ...

  6. Encryption (hard) CodeForces - 958C3 (树状数组)

    大意: 给定序列$a$, 要求将$a$分成$k$个非空区间, 使得区间和模$p$的和最小, 要求输出最小值. $k$和$p$比较小, 直接暴力$dp$, 时间复杂度是$O(nklogp)$, 空间是$ ...

  7. codeforces 597C (树状数组+DP)

    题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...

  8. Codeforces 597C. Subsequences (树状数组+dp)

    题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...

  9. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

    题目链接:http://codeforces.com/contest/703/problem/D 给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少. 我们可以先预处理前缀和X ...

随机推荐

  1. Linux添加或修改ssh端口

    1)  查看ssh服务是否安装齐全 这里使用”rpm –qa|grep ssh”命令查看. [root@xuexi ~]# rpm -qa | grep ssh libssh2-1.4.3-10.el ...

  2. BZOJ 3676 [Apio2014]回文串(回文树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ...

  3. 【最大团转最大点独立集(匈牙利算法+时间戳优化)】BZOJ2744-[HEOI2012]朋友圈

    [题目大意] 有两个国家A和B.存在以下朋友关系: 1.A国:每个人都有一个友善值,当两个A国人的友善值a.b,如果a xor b mod 2=1,那么这两个人都是朋友,否则不是: 2.B国:每个人都 ...

  4. 数据结构--汉诺塔--借助栈实现非递归---Java

    /*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...

  5. kosaraju算法求强连通分量

    什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...

  6. Educational Codeforces Round 8 A. Tennis Tournament 暴力

    A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...

  7. 神技!微信小程序(应用号)抢先入门体验(附最新案例-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

  8. zk选举过程

    1. 服务器启动时期的Leader选举 若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例.在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Le ...

  9. The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:

    今天下载Windows安装版的tomcat5.5,安装完以后启动时候出现: The Apache Tomcat Native library which allows optimal performa ...

  10. ylbtech-LanguageSamples-Security(安全)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Security(安全) 1.A,Security 示例(Sample) 返回顶部 “安 ...