出自——博客园-zhouzhendong

~去博客园看该题解~

题目

POJ3321 Apple Tree

题意概括

有一颗01树,以结点1为树根,一开始所有的结点权值都是1,有两种操作:

  1.改变其中一个结点的权值(0变1,1变0)

  2.询问子树X的节点权值和。

输入描述

一组数据。

先是一个数n,表示有n个节点。

接下去n-1行,每行表示一条边。

然后一个数m,表示有m个操作。

然后m行,每行一个字母一个数x,如果字母是Q,则是询问;否则是修改。

输出描述

每一个询问一行,表示答案。

题解

直接把题目变成dfs序上单点修改和区间sum询问的问题。

单点修改,不用线段树,树状数组就可以了。

如果你非要用线段树我也不拦你……

代码

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+,M=N*;
struct Edge{
int cnt,y[M],nxt[M],fst[N];
void set(){
cnt=;
memset(fst,,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}e;
int n,m;
int in[N],out[N],time;
int tree[N],v[N];//树状数组
int lowbit(int x){
return x&-x;
}
void dfs(int prev,int rt){
in[rt]=++time;
for (int i=e.fst[rt];i;i=e.nxt[i])
if (e.y[i]!=prev)
dfs(rt,e.y[i]);
out[rt]=time;
}
void update(int x,int d){
for (;x<=n;x+=lowbit(x))
tree[x]+=d;
}
int sum(int x){
int ans=;
for (;x>;x-=lowbit(x))
ans+=tree[x];
return ans;
}
int query(int L,int R){
return sum(R)-sum(L-);
}
int main(){
e.set();
scanf("%d",&n);
for (int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
e.add(a,b);
e.add(b,a);
}
time=;
dfs(,);
for (int i=;i<=n;i++)
tree[i]=lowbit(i),v[i]=;
scanf("%d",&m);
for (int i=,x;i<=m;i++){
char ch[];
scanf("%s%d",ch,&x);
if (ch[]=='Q')
printf("%d\n",query(in[x],out[x]));
else
update(in[x],-v[x]*),v[x]^=;
}
return ;
}

POJ3321Apple Tree Dfs序 树状数组的更多相关文章

  1. 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 ...

  2. 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 ...

  3. [poj3321]Apple Tree(dfs序+树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26762   Accepted: 7947 Descr ...

  4. [Split The Tree][dfs序+树状数组求区间数的种数]

    Split The Tree 时间限制: 1 Sec  内存限制: 128 MB提交: 46  解决: 11[提交] [状态] [讨论版] [命题人:admin] 题目描述 You are given ...

  5. POJ 3321 Apple Tree DFS序 + 树状数组

    多次修改一棵树节点的值,或者询问当前这个节点的子树所有节点权值总和. 首先预处理出DFS序L[i]和R[i] 把问题转化为区间查询总和问题.单点修改,区间查询,树状数组即可. 注意修改的时候也要按照d ...

  6. Codeforces Round #381 (Div. 2) D. Alyona and a tree dfs序+树状数组

    D. Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  7. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  8. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  9. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

随机推荐

  1. 分布式服务管理框架 ZooKeeper

      核心功能   统一命名服务(Name Service)   通过有层次的目录结构产生唯一的名称,同时可以将名称关联到特定资源   配置管理(Configuration Management)   ...

  2. [转]Java微服务框架选型(Dubbo 和 Spring Cloud?)

    转载于 http://www.cnblogs.com/xishuai/p/dubbo-and-spring-cloud.html 微服务(Microservices)是一种架构风格,一个大型复杂软件应 ...

  3. 并发性能的隐形杀手之伪共享(false sharing)

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  4. Codeforces 833D Red-Black Cobweb [点分治]

    洛谷 Codeforces 思路 看到树上路径的统计,容易想到点分治. 虽然只有一个限制,但这个限制比较麻烦,我们把它拆成两个. 设黑边有\(a\)条,白边有\(b\)条,那么有 \[ 2a\geq ...

  5. Confluence 6 Windows 中以服务方式自动重启为服务手动安装 Confluence 分发包

    在 Windows: 打开一个命令输入框,然后修改目录到 <CONFLUENCE-INSTALL>/bin 目录中.你需要以管理员权限运行这个命令行输入框(Run as administr ...

  6. Confluence 6 整合到支持的附件存储选项

    如果你现在正在存储附件到 WebDav 或者你的数据库中.你可以整合附件的存储到文件系统中.当你的附件从数据库中被合并到文件系统后,你存储在数据库中的附件数据就可以从数据库中删除了. 当附件合并进行的 ...

  7. Confluence 6 在你的 LDAP 目录中优化用户和用户组数量

    连接 LDAP 服务器能为你的用户管理提供灵活高效的解决方案.为了达到优化的性能,后台同步程序将会从 LDAP 上查找和下载数据同步到你本地的 Confluence 服务器数据库上同时还会定时的更新数 ...

  8. 【shell】两种字符串提取场景的实现

    shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...

  9. js变量前的+是什么意思

    js变量前的+是什么意思   if (+value >= distance) {} 这个+什么意思 可以理解为 Number(value) 会将其按照Number函数的规则转换为数值或者NaN, ...

  10. Java Insets获取窗口的顶、底、左、右的大小

    import java.awt.Insets; import javax.swing.JFrame; public class NewFrame { public static void main(S ...