CodeForces 383C Propagating tree
Propagating tree
This problem will be judged on CodeForces. Original ID: 383C
64-bit integer IO format: %I64d Java class name: (Any)
This tree has a special property: when a value val is added to a value of node i, the value -val is added to values of all the children of node i. Note that when you add value -val to a child of node i, you also add -(-val) to all children of the child of node i and so on. Look an example explanation to understand better how it works.
This tree supports two types of queries:
- "1 x val" — val is added to the value of node x;
- "2 x" — print the current value of node x.
In order to help Iahub understand the tree better, you must answer m queries of the preceding type.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 200000). The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 1000). Each of the next n–1 lines contains two integers viand ui (1 ≤ vi, ui ≤ n), meaning that there is an edge between nodes vi and ui.
Each of the next m lines contains a query in the format described above. It is guaranteed that the following constraints hold for all queries: 1 ≤ x ≤ n, 1 ≤ val ≤ 1000.
Output
For each query of type two (print the value of node x) you must print the answer to the query on a separate line. The queries must be answered in the order given in the input.
Sample Input
5 5
1 2 1 1 2
1 2
1 3
2 4
2 5
1 2 3
1 1 2
2 1
2 2
2 4
3
3
0
Hint
The values of the nodes are [1, 2, 1, 1, 2] at the beginning.
Then value 3 is added to node 2. It propagates and value -3 is added to it's sons, node 4 and node 5. Then it cannot propagate any more. So the values of the nodes are [1, 5, 1, - 2, - 1].
Then value 2 is added to node 1. It propagates and value -2 is added to it's sons, node 2 and node 3. From node 2 it propagates again, adding value 2 to it's sons, node 4 and node 5. Node 3 has no sons, so it cannot propagate from there. The values of the nodes are [3, 3, - 1, 0, 1].
You can see all the definitions about the tree at the following link: http://en.wikipedia.org/wiki/Tree_(graph_theory)
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
struct node {
int lt,rt,val;
};
struct arc{
int to,next;
arc(int x = ,int y = -){
to = x;
next = y;
}
};
node tree[][maxn<<];
arc e[maxn<<];
int head[maxn],lt[maxn],rt[maxn],val[maxn],d[maxn],idx,tot,n,m;
void add(int u,int v){
e[tot] = arc(v,head[u]);
head[u] = tot++;
}
void dfs(int u,int fa){
lt[u] = ++idx;
d[u] = d[fa]+;
for(int i = head[u]; ~i; i = e[i].next){
if(e[i].to == fa) continue;
dfs(e[i].to,u);
}
rt[u] = idx;
}
void build(int lt,int rt,int v) {
tree[][v].lt = tree[][v].lt = lt;
tree[][v].rt = tree[][v].rt = rt;
tree[][v].val = tree[][v].val = ;
if(lt == rt) return;
int mid = (lt + rt)>>;
build(lt,mid,v<<);
build(mid+,rt,v<<|);
}
void pushdown(int v,int o) {
if(tree[o][v].val) {
tree[o][v<<].val += tree[o][v].val;
tree[o][v<<|].val += tree[o][v].val;
tree[o][v].val = ;
}
}
void update(int lt,int rt,int v,int val,int o) {
if(tree[o][v].lt >= lt && tree[o][v].rt <= rt) {
tree[o][v].val += val;
return;
}
pushdown(v,o);
if(lt <= tree[o][v<<].rt) update(lt,rt,v<<,val,o);
if(rt >= tree[o][v<<|].lt) update(lt,rt,v<<|,val,o);
}
int query(int p,int v,int o){
if(tree[o][v].lt == tree[o][v].rt)
return tree[o][v].val;
pushdown(v,o);
if(p <= tree[o][v<<].rt) return query(p,v<<,o);
if(p >= tree[o][v<<|].lt) return query(p,v<<|,o);
}
int main() {
int u,v,op;
while(~scanf("%d %d",&n,&m)){
memset(head,-,sizeof(head));
idx = tot = ;
for(int i = ; i <= n; ++i)
scanf("%d",val+i);
for(int i = ; i < n; ++i){
scanf("%d %d",&u,&v);
add(u,v);
add(v,u);
}
build(,n,);
d[] = ;
dfs(,);
for(int i = ; i < m; ++i){
scanf("%d",&op);
if(op == ){
scanf("%d %d",&u,&v);
update(lt[u],rt[u],,v,d[u]&);
if(lt[u] < rt[u]) update(lt[u]+,rt[u],,-v,(~d[u])&);
}else{
scanf("%d",&u);
printf("%d\n",val[u]+query(lt[u],,d[u]&));
}
}
}
return ;
}
树状数组
#include <bits/stdc++.h>
using namespace std;
const int maxn = ;
vector<int>g[maxn];
int c[][maxn],val[maxn],d[maxn],L[maxn],R[maxn],clk,n,m;
void dfs(int u,int fa,int dep){
d[u] = dep;
L[u] = ++clk;
for(int i = g[u].size()-; i >= ; --i){
if(g[u][i] == fa) continue;
dfs(g[u][i],u,dep+);
}
R[u] = clk;
}
void update(int cur,int i,int val){
while(i < maxn){
c[cur][i] += val;
i += i&-i;
}
}
int sum(int cur,int i,int ret = ){
while(i > ){
ret += c[cur][i];
i -= i&-i;
}
return ret;
}
int main(){
int u,v,op,x;
while(~scanf("%d%d",&n,&m)){
for(int i = ; i <= n; ++i){
g[i].clear();
scanf("%d",val+i);
}
for(int i = ; i < n; ++i){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(,-,);
memset(c,,sizeof c);
while(m--){
scanf("%d%d",&op,&x);
if(op == ){
scanf("%d",&v);
update(d[x]&,L[x],v);
update(d[x]&,R[x]+,-v);
}else printf("%d\n",val[x] + sum(d[x]&,L[x]) - sum(~d[x]&,L[x]));
}
}
return ;
}
CodeForces 383C Propagating tree的更多相关文章
- codeforces 383C Propagating tree 线段树
http://codeforces.com/problemset/problem/383/C 题目就是说, 给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...
- Codeforces 383C . Propagating tree【树阵,dfs】
标题效果: 有一棵树,有两种操作模式对本树:1:表示为(1 x val),在NOx加在节点上val,然后x每个节点加上儿子- val.给每个儿子一个儿子在一起-(- val),加到没有儿子为止.2:表 ...
- Codeforces 383C Propagating tree, 线段树, 黑白染色思想
按深度染色,奇深度的点存反权值. #include <bits/stdc++.h> using namespace std; vector <]; ],a[],s[],vis[],i ...
- CodeForces 384E Propagating tree (线段树+dfs)
题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 - ...
- AC日记——Propagating tree Codeforces 383c
C. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组
C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...
- Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+ 树状数组或线段树
C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...
- Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树
题目链接:点击传送 E. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- Problem - D - Codeforces Fix a Tree
Problem - D - Codeforces Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...
随机推荐
- Android APP 调试过程中遇到的问题。
调试过过程中APP安装完启动后有的时候会异常退出,报这个错误.有的时候可以直接启动.查找不到原因.网上说把commit方法替换成commitAllowingStateLoss() 也无效. Andro ...
- PIC c语言
rom类型,对于占内存的类型定义为rom类型,跟标准c中的const不一样,const跟rom不能通用,否则编译会报type qualifier dismatch 有些变量定义成了rom型,那么如果改 ...
- codeforces 493 D Vasya and Chess【 博弈 】
题意:给出n*n的棋盘,白方在(1,1),黑方在(1,n)处,每一步可以上下左右对角线走,哪个先抓到另一个,则它获胜 可以画一下,发现n是奇数的时候,白方先走,无论它怎么走,黑方和它走对称的,黑方都一 ...
- eclipse的maven工程视图切换
上面图切换成下面图: 点击eclipse右上角,如下图红圈,然后在选择javaEE这样就切换成javaEE视图了
- .NET Framework 3.5 无法安装以下功能 安装错误:0x800F0906(客户端加域后出现)
问题:安装错误:0x800F0906 系统安装并加域后,在安装用友软件时提示没有.net 3.5 系统为win10 但是,点击确定后,却出现了这样的错误.如下: 点击下载并安装此功能,出现了这样 ...
- 虚拟机创建后该如何获取IP地址并访问互联网实用教程
之前在做项目的时候主机IP地址.网关.DNS.子网掩码等都是公司或者对方直接给提供的,但是如果我们自己想搭建一台虚拟机或者一台集群的话,手头又没有IP地址,该肿么办呢? 白慌,这里介绍一个小技巧, ...
- [SCOI2009]windy数 数位dp
Code: #include<cmath> #include<iostream> #include<cstdio> using namespace std; con ...
- 多任务-进程之Queue的进程间通信
1.经过线程和进程的对比,不难的知道,线程和进程有相当大的区别,如全局变量资源不能够共享. 2.在不同的进程间,如何实现通信呢? 需要提及的一个概念就是Queue,它是一个消息队列,下面通过一个例子来 ...
- vue总线bus传值的一些问题
动态组件中用总线Bus的坑 在我们的项目总难免会遇到用动态组件,这里就拿vue官方的例子为例,我们欲在组件中添加总线bus(其实官方推荐的vuex更好用,但是有时候我们只需要传一个小状态,不需要用vu ...
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...