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,便是操作 ...
随机推荐
- Eclipse schema xml提示
步骤一:确定xsd文件位置 spring-framework-3.2.0.RELEASE\schema\beans 步骤二:复制路径 步骤三:搜索“xml catalog” 步骤四:添加约束提示 ...
- SpringCloud学习笔记(13)----Spring Cloud Netflix之Hystrix断路器的隔离策略
说明 : 1.Hystrix通过舱壁模式来隔离限制依赖的并发量和阻塞扩散 2. Hystrix提供了两种隔离策略:线程池(THREAD)和信号量隔离SEMAPHORE). 1. 线程池隔离(默认策略模 ...
- (转载)比较web ui 框架
以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范, ...
- 学习参考:《Python语言及其应用》中文PDF+英文PDF+代码
学习简单的数据类型,以及基本的数学和文本操作,学习用Python内置的数据结构来处理数据: 掌握Python的代码结构和函数的用法:使用模块和包编写大规模Python程序:深入理解对象.类和其他面向对 ...
- 让div垂直居中
参考链接:https://www.cnblogs.com/softwarefang/p/6095806.html 以前我的方法总是比较粗暴,纯粹通过margin来实现,这个方法的缺点不仅在于需要多次微 ...
- 2018秋寒假作业4——PTA编辑总结1
#include<stdio.h> #include<math.h> int main(void) { int n,i,j,p,m,ge,N,k; char op; ){ sc ...
- [terry笔记]oracle里的执行计划-查看
内容主要来自看书学习的笔记,如下记录了常见查询执行计划的方法. 2.2 如何查看执行计划 1.explain plan 2.dbms_xplan包 3.autotrace 4.10046事件 5.10 ...
- solr + eclipse 调试环境搭建
1: 在官网下载对应源码 http://www.fayea.com/apache-mirror/lucene/solr/4.1.0/ 选择源码文件,如图所示: 2: 解压后目录如图所示: 在根目录下存 ...
- 集团公司(嵌入ETL工具)財务报表系统解决方式
集团公司(嵌入ETL工具)財务报表系统解决方式 一.项目背景: 某集团公司是一家拥有100多家子公司的大型集团公司,旗下子公司涉及各行各业,包含:金矿.铜矿.房产.化纤等.因为子公司在业务上的差异.子 ...
- 9、包、访问控制、import、static、static代码块、final、抽象类、接口、instanceof、多态
1.包 三级命名:公司的尾缀(com).公司名字(baidu).业务(Sale) java.lang:默认包:String.Math,Object,System java.util:工具包 java. ...