Codeforces 383C . Propagating tree【树阵,dfs】
标题效果:
做法:
比方说有例如以下一棵树:
(第一行为新数组下标。第二行为新数组存的节点序号)
遍历完之后,再对根节点的每一个儿子做一遍同样的操作就可以。(详细能够看代码)
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #define N 200020
- using namespace std;
- struct ee//存储须要改动哪些区间的结构体
- {
- int x1,y1,x2,y2;
- }e[N];
- vector<int> g[N];
- int n,m,a[N],d[N],c[N],bef[N],index=1;
- void dfs1(int x,int fa,int deep)//处理d[]数组
- {
- d[x]=deep;
- for(int i=0;i<g[x].size();i++)
- if(g[x][i]!=fa) dfs1(g[x][i],x,1-deep);
- }
- void dfs2(int x,int fa,int deep)//得到新数组
- {
- if(d[x]==deep) bef[x]=index++;//aft[index++]=x;//bef[i] 当中,i是原节点的编号,bef[i]是i在新数组中的下标
- for(int i=0;i<g[x].size();i++)
- if(g[x][i]!=fa) dfs2(g[x][i],x,deep);
- }
- void dfs3(int x,int fa)//预处理每一个点的属性
- {
- for(int i=0;i<g[x].size();i++)
- if(g[x][i]!=fa) dfs3(g[x][i],x);
- int ma1=bef[x],mi2=N,ma2=0;
- for(int i=0;i<g[x].size();i++)
- {
- if(g[x][i]==fa) continue;
- int cur=g[x][i];
- mi2=min(mi2,e[cur].x1);
- ma2=max(ma2,e[cur].y1);
- ma1=max(ma1,e[cur].y2);
- }
- e[x].x1=bef[x],e[x].y1=ma1,e[x].x2=mi2,e[x].y2=ma2;//[x1,y1]为须要加值操作的区间,[x2,y2]为须要减值操作的区间,能够由儿子确定
- }
- int getnum(int x)//以下便是树状数组的区间改动,点查询函数咯~
- {
- int rnt=0;
- for(int i=x;i<=n;i+=(i&(-i)))
- {
- rnt+=c[i];
- }
- return rnt;
- }
- void add(int i,int a)
- {
- while(i>=1)
- {
- c[i]+=a;
- i-=(i&(-i));
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++) scanf("%d",a+i);
- for(int i=0;i<n-1;i++)
- {
- int a,b;
- scanf("%d%d",&a,&b);
- g[a].push_back(b),g[b].push_back(a);
- }
- dfs1(1,0,1);//计算d[]数组
- dfs2(1,0,1);//对根节点进行处理
- for(int i=0;i<g[1].size();i++)
- dfs2(g[1][i],1,0);//对根节点的每一个儿子进行处理
- dfs3(1,0);//预处理
- while(m--)
- {
- int ty;
- scanf("%d",&ty);
- if(ty==1)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- int l1=e[x].x1,r1=e[x].y1,l2=e[x].x2,r2=e[x].y2;
- add(r1,y),add(l1-1,-y);
- if(r2!=0) add(r2,-y),add(l2-1,y);//假设不是根节点再进行减操作
- }
- else
- {
- int x;
- scanf("%d",&x);
- cout<<getnum(bef[x])+a[x]<<endl;
- }
- }
- return 0;
- }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Codeforces 383C . Propagating tree【树阵,dfs】的更多相关文章
- CodeForces 383C Propagating tree
Propagating tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...
- codeforces 383C Propagating tree 线段树
http://codeforces.com/problemset/problem/383/C 题目就是说, 给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...
- 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 的子结点的子结点加上 - ...
- Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)
D. Alyona and a tree Problem Description: Alyona has a tree with n vertices. The root of the tree is ...
- CodeForces 343D water tree(树链剖分)
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- 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 ...
随机推荐
- win8/win10/win2012r2 存储池 冗余分析
StorageSpace:a. Simple,相当于RAID0,无冗余,不考虑b. Two-way Mirror,双重镜像,至少2块盘,性能单盘,可以坏一块盘c. Three-way Mirror,三 ...
- 同步特定源代码到 omni_rom源代码目录里面
#!/bin/bash base_path="/Volumes/Android/omnirom_5.0" #此目录是我存放源代码的目录 xiaomi_device="de ...
- 在基于阿里云serverCentOS6.5下安装Subversion 1.6.5服务
近期阿里云搞了个1元免费提供云server的活动,偶心痒痒就申请了一个. 正好能够作为团队的SVNserver了,以下就来部署SVN服务吧. 一.安装基础环境 apr-1.5.0.tar.gz apr ...
- Android自己主动化測试——CTS測试
一.为什么须要兼容性測试(下面称CTS)? 1.1.让APP提供更好的用户体验.用户能够选择很多其它的适合自己设备的APP.让APP更稳定. 1.2.让开发人员设计更高质量的APP. 1.3.通过CT ...
- perl操作sqlserver实现BCP
#!C:\Perl64\bin #由BCP备份和恢复SQLSERVER指定表 use 5.014; #加载用户和password型材 my $username ; my $passwd; ##得到us ...
- 赵雅智_BroadcastReceiver短信监听
AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...
- iOS_17_控制开关_TabBarController_由storyboard道路
最后效果图: main.storyboard BeyondViewController.m中有一句关键代码,设置tabbarItem图片的样式(30*30) // // BeyondViewContr ...
- IE6浏览器的一些问题
背景图像缓存 // IE6 background image caching fix. try { document.execCommand("BackgroundImageCache&qu ...
- .NET 并行(多核)编程系列之七 共享数据问题和解决概述
原文:.NET 并行(多核)编程系列之七 共享数据问题和解决概述 .NET 并行(多核)编程系列之七 共享数据问题和解决概述 前言:之前的文章介绍了了并行编程的一些基础的知识,从本篇开始,将会讲述并行 ...
- Kienct与Arduino学习笔记(2) 深度图像与现实世界的深度图的坐标
转载请注明出处:http://blog.csdn.net/lxk7280 首先,要接触一下KinectOrbit这个摄像机库,这篇文章中有这个库的下载网址和简单的介绍:http://blog.csdn ...