Codeforces 383C Propagating tree, 线段树, 黑白染色思想

按深度染色,奇深度的点存反权值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 vector <int> g[500005];
 5 int t1,t2,t3,seq[500005],a[1000005],s[500005],vis[500005],ind,n,m,src[500005],frm[500005],dep[500005];
 6
 7 void dfs(int p) {
 8     vis[p]=1;
 9     frm[p]=ind+1;
10     for(int i=0;i<g[p].size();i++)
11         if(vis[g[p][i]]==0)
12             dep[g[p][i]]=dep[p]+1,
13             dfs(g[p][i]);
14     seq[p]=++ind;
15 }
16
17 void build(int p,int l,int r){
18     if(l==r) a[p]=s[l];
19     else build(p*2,l,(l+r)/2),build(p*2+1,(l+r)/2+1,r);
20 }
21
22 void modify(int p,int l,int r,int ql,int qr,int k){
23     if(l>qr||r<ql) return;
24     if(l>=ql&&r<=qr) {a[p]+=k; return;}
25     a[p*2]+=a[p], a[p*2+1]+=a[p], a[p]=0;
26     modify(p*2,l,(l+r)/2,ql,qr,k);
27     modify(p*2+1,(l+r)/2+1,r,ql,qr,k);
28 }
29
30 int query(int p,int l,int r,int pos){
31     if(l==r) return a[p];
32     a[p*2]+=a[p], a[p*2+1]+=a[p], a[p]=0;
33     if(pos<=(l+r)/2) return query(p*2,l,(l+r)/2,pos);
34     else return query(p*2+1,(l+r)/2+1,r,pos);
35 }
36
37 int main(){
38     ios::sync_with_stdio(false);
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=n;i++) scanf("%d",&src[i]);
41     for(int i=1;i<n;i++) scanf("%d%d",&t1,&t2), g[t1].push_back(t2), g[t2].push_back(t1);
42     dep[1]=1; dfs(1);
43     for(int i=1;i<=n;i++) dep[i]=-1+2*(dep[i]%2);
44     for(int i=1;i<=n;i++) s[seq[i]]=dep[i]*src[i];
45     build(1,1,n);
46     for(int i=1;i<=m;i++) {
47         scanf("%d%d",&t1,&t2);
48         if(t1==1){
49             scanf("%d",&t3);
50             modify(1,1,n,frm[t2],seq[t2],dep[t2]*t3);
51         }
52         else{
53             printf("%d\n",dep[t2]*query(1,1,n,seq[t2]));
54         }
55     }
56     return 0;
57 }

原文地址:https://www.cnblogs.com/mollnn/p/8439672.html

时间: 2024-10-08 21:05:37

Codeforces 383C Propagating tree, 线段树, 黑白染色思想的相关文章

Codeforces 383C . Propagating tree【树状数组,dfs】

题目大意: 有一棵树,对这个树有两种操作:1:表示为(1 x val),在编号为x的节点上加上val,然后给x节点的每个儿子加上- val,再给每个儿子的儿子加上-(- val),一直加到没有儿子为止.2:表示为(2 x)查询x节点上的值. 做法: 由于每次修改操作修改的并不是一个值,而是很多值,那我们将该题抽象成区间修改,点查询的问题.那怎么抽象呢?可以明白的是,每次操作虽然有加有减,但是每次做加法操作,或者减法操作的都是同一部分数(也就是说,在某次加上同一个数的节点们,下次操作一定是加上或者

CodeForces - 383C Propagating tree(dfs + 线段树)

题目大意: 给出一棵树,树上每个节点都有权值,然后有两个操作. 1 x val 在结点x上加上一个值val,x的儿子加上 -val,x的儿子的儿子加上 - (-val),以此类推. 2 x 问x节点的值. 思路分析: 每个节点上加值都是给自己的儿子节点加,而且这个是颗树. 比如样例上的,如果你给node 1加一个值,那么五个节点都加. 再给node 2加个值,2的儿子节点也加了,之前给1加的值也要加到2号节点的儿子. 所以你会发现节点的儿子会存在一个从属的关系. 这样的话,我们可以把所有节点从新

CodeForces 383C Propagating tree

Propagating tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 383C64-bit integer IO format: %I64d      Java class name: (Any) Iahub likes trees very much. Recently he discovered an interesting tree

CF 383C Propagating tree [想法+树状数组]

题意: 给一棵树 给出两种操作: 1.在某个结点上加上一个值,在这个结点所有的儿子结点上减去这个值,在这个结点的所有孙子结点上加上这个值,在所有曾孙子结点上减去这个值,直到底. 2.查询某个结点上的值 分析: 把这个问题转化为树状数组的区间求和 样例经过dfs处理后如下,每个结点处理出了两个值l,r,层数1,2,3...,层数为奇数的属性为0,层数为偶数的属性为1 可以看到,子树下的结点的两个数值都是包含在子数的根结点的两数范围内的 而子树根结点的兄弟结点的两数范围则不是包含在子树根结点的两数范

HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)

题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树).当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工作),题目会询问你其中某个人正在做的工作. 解题思路:其实从"一个人分配他的下属做一样的工作"这里就可以看出来了,这相当于让一块区间的人都做一样的事,就是线段树区间染色问题.但不能使用线段树,要先将多叉树铺展开,将节点映射到线段上.把每个人的管理区段找出来(把属于同一个人管的放一起,上司放

[Codeforces 1295E]Permutation Separation(线段树+贪心)

[Codeforces 1295E]Permutation Separation(线段树+贪心) 题面 给出一个排列\(p_1,p_2,...p_n\).初始时你需要选择一个位置把排列分成左右两个.然后在两个序列间移动元素使得左边序列的所有元素都比右边的所有元素小.给出每个元素\(p_i\)从一个序列移动到另一个序列的代价\(a_i\). 分析 显然最后得到的序列是小的数在一边,大的数在另一边.设从值为\(i\)的元素处分开之后移动代价为\(ans_i\). 一开始假设所有数都移到右边序列,那么

HDU 4107 Gangster Segment Tree线段树

这道题也有点新意,就是需要记录最小值段和最大值段,然后成段更新这个段,而不用没点去更新,达到提高速度的目的. 本题过的人很少,因为大部分都超时了,我严格按照线段树的方法去写,一开始居然也超时. 然后修补了两个地方就过了,具体修改的地方请参看程序. 知道最大值段和最小值段,然后修补一下就能过了.不是特别难的题目. #include <stdio.h> #include <string> #include <algorithm> using namespace std; c

POJ 2528 Mayor&#39;s posters(线段树区间染色+离散化或倒序更新)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 59239   Accepted: 17157 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral post

CodeForces 620E New Year Tree(线段树的骚操作第二弹)

The New Year holidays are over, but Resha doesn't want to throw away the New Year tree. He invited his best friends Kerim and Gural to help him to redecorate the New Year tree. The New Year tree is an undirected tree with n vertices and root in the v