CodeForces 384E Propagating tree (dfs序)
来源:互联网 发布:贪吃蛇java课程设计 编辑:程序博客网 时间:2024/06/07 09:58
题目传送门:http://codeforces.com/problemset/problem/384/E
题意:给你一棵树,根节点1,每个节点有权值,然后你可以对一个节点进行操作,在它的权值上加上
题解:修改一个节点,子树上的其他节点都被修改,很像dfs序诶,实际上确实就是,但是这个不像前面一样一个区间里面一样的操作,它在区间里的操作有的是加
代码:
#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;#define MAX 200005#define MAXN 6005#define maxnode 15#define sigma_size 30#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lrt rt<<1#define rrt rt<<1|1#define middle int m=(r+l)>>1#define LL long long#define ull unsigned long long#define mem(x,v) memset(x,v,sizeof(x))#define lowbit(x) (x&-x)#define pii pair<int,int>#define bits(a) __builtin_popcount(a)#define mk make_pair#define limit 10000//const int prime = 999983;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f;const double pi = acos(-1.0);//const double inf = 1e18;const double eps = 1e-8;const LL mod = 1e9+7;const ull mx = 133333331;/*****************************************************/inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/struct Edge{ int v,next;}edge[MAX*2];int head[MAX];int tot;int c[MAX];int p1[MAX];int p2[MAX];int dep[MAX];int ti;int dfsnum[MAX];LL sum[MAX<<2];int col[MAX<<2];int add[MAX<<2];void init(){ mem(head,-1); tot=0;ti=0;}void add_edge(int a,int b){ edge[tot]=(Edge){b,head[a]}; head[a]=tot++;}void dfs(int u,int fa,int d){ p1[u]=++ti; dep[u]=d; dfsnum[ti]=u; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(v==fa) continue; dfs(v,u,d+1); } p2[u]=ti;}void pushdown(int rt){ if(add[rt]){ add[lrt]+=add[rt]; add[rrt]+=add[rt]; add[rt]=0; }}void build(int l,int r,int rt){ add[rt]=0; if(l==r){ sum[rt]=c[dfsnum[l]]; if(dep[dfsnum[l]]&1) col[rt]=-1; else col[rt]=1; return; } middle; build(lson); build(rson);}void update(int l,int r,int rt,int L,int R,int d){ if(L<=l&&r<=R){ add[rt]+=d; return; } middle; pushdown(rt); if(L<=m) update(lson,L,R,d); if(R>m) update(rson,L,R,d);}int query(int l,int r,int rt,int pos){ if(l==r){ return sum[rt]+add[rt]*col[rt]; } middle; pushdown(rt); if(pos<=m) return query(lson,pos); else return query(rson,pos);}int main(){ //freopen("in.txt","r",stdin); int n,m; while(cin>>n>>m){ init(); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<n;i++){ int a,b; scanf("%d%d",&a,&b); add_edge(a,b); add_edge(b,a); } dfs(1,-1,0); build(1,n,1); //for(int i=1;i<=n;i++) cout<<p1[i]<<endl; while(m--){ int op,a; scanf("%d%d",&op,&a); if(op==1){ int val; scanf("%d",&val); if(dep[a]&1) val=-val; update(1,n,1,p1[a],p2[a],val); //for(int i=1;i<=n;i++){ cout<<query(1,n,1,p1[i])<<" ";} //cout<<endl; } else printf("%d\n",query(1,n,1,p1[a])); } } return 0;}
0 0
- CodeForces 384E Propagating tree (dfs序)
- CodeForces 384E Propagating tree 树状数组dfs序组合使用
- Codeforces 383C Propagating tree DFS序+BIT
- CodeForces - 383C Propagating tree(dfs + 线段树)
- 【codeforces 384E】Propagating tree 中文题意&题解&代码(c++)
- codeforces#225-C - Propagating tree-dfs序(奇偶)+线段树
- Codeforces Round #225 (Div. 1) C-Propagating tree (DFS序+线段树/树状数组)
- Codeforces Round #225 (Div. 2) E. Propagating tree
- Codeforces Round#225 div.2E Propagating tree 线段树
- Codeforces 383C . Propagating tree【树状数组,dfs】
- codeforces 337E Divisor Tree (dfs)
- [codeforces383C - Propagating tree] dfs序 +segment tree
- CodeForces 383C Propagating tree
- codeforces 383C Propagating tree
- CODEFORCES, 383C,Propagating tree
- CF 383C Propagating tree(dfs序+线段树)
- Codeforces 383C Propagating tree(树状数组)
- Codeforces 383C Propagating tree(树状数组)
- Navicat For Mysql快捷键
- 注释转换<C注释-->C++注释>
- Android--屏幕旋转生命周期
- 在ucos系统上使用USART1串口中断函数处理串口数据
- 浅谈时间函数gettimeofday的成本 ——gettimeofday是由底层do_gettimeofday返回的?!
- CodeForces 384E Propagating tree (dfs序)
- 一种提高Android应用进程存活率新方法
- 用于px和dp相互转换
- java中volatile关键字的含义
- java入门教程-2.5Java数组的定义和使用
- 【常用算法思路分析系列】链表相关高频题集
- Java中ArrayList、Vector、 LinkedList的区别
- Android 自定义View属性相关细节总结
- Android自定义控件之组合控件