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,便是操作 ...
随机推荐
- MySQL学习(三)——Java连接MySQL数据库
1.什么是JDBC? JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据 ...
- 手工清理win7系统C盘的技巧
在我们日常使用电脑的过程中,随着使用的时候越久,大家就会发现电脑的运行速度变的越慢了,大家都知道很多系统东西一般都会安装在C盘,系统在运行的时候就会不断的产生垃圾文件以及其他我们根本用不到的文件,这样 ...
- Activiti 23张表及7大服务详解
7大服务介绍 服务名称 描述 RepositoryService Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件, ...
- JDOM,dom4j方式解析XML
<?xml version="1.0" encoding="UTF-8"?> <dataSources> <!-- 定义MySQL ...
- 越努力越幸运--3-日常bug修复
提供一个so给PYTHON调用,后端发现业务处理流程不是按照方法传入的参数来跑. 查看c的代码,看了客户端没看出什么问题,查看服务端为什么会出现这样的情况,有些字段明显不是入参带过来的,跟踪服务端解析 ...
- 再来一波PHP程序员必看书籍
前言 https://segmentfault.com/a/11... 内列出的是已看过的. 本篇文章内列出的书籍是准备要看或者正在看的,与大家分享. 知识无价,还是建议各位童鞋把更多的资金投入到学习 ...
- 利用shell脚本添加环境变量
在shell脚本设置了环境变量,如export LIBRARY_PATH=./lib/,执行了此脚本后, 在执行生成的可执行文件,提示错误 error while loading shared lib ...
- Linux gcc中的LIBRARY_PATH 和 LD_LIBRARY_PATH
1. GNU 上关于LIBRARY_PATH的说明: LIBRARY_PATH The value of LIBRARY_PATH is a colon-separated list of direc ...
- MySQL数据类型及后面小括号的意义
1,数值类型 1.1数值类型的种类 标准 SQL 中的数值类型,包括严格数值类型(INTEGER.SMALLINT.DECIMAL.NUMERIC),以及近似数值数据类型(FLOAT.REAL.DOU ...
- ESRI.ArcGIS.Controls.AxMapControl
今天在写DLL时发现,直接引用ESRI.ArcGIS.Controls,发现AxMapControl的参数仍然不好用,后来发现,需要引用ESRI.ArcGIS.AxControls这个DLL.而且还需 ...