【树的遍历 树状数组】POJ_3321 Apple Tree

2024-01-30 04:58

本文主要是介绍【树的遍历 树状数组】POJ_3321 Apple Tree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

给出一个苹果树的一些分叉(x,y),表示y是x的子节点,给出m次操作,有两种:
1、C x 如果叉x有苹果就摘,没有就长,相当于取反。
2、Q x 查询叉x(包括x)的子节点上一共有多少苹果。

思路

先进行深度优先遍历求出这棵树的先序后序遍历顺序,然后我们进行C操作时就判断然后取反,进行Q操作时就用 f i n d ( e n d [ x ] ) − f i n d ( b e g i n [ x ] ) , b e g i n find(end[x])-find(begin[x]),begin find(end[x])find(begin[x]),begin是先序遍历, e n d end end是后序遍历,这样子我们可以求出 x x x的子节点的苹果数量了。

代码

#include<cstdio>
struct node{int next,to;
}edge[100001];
int tot,n,m,x,tree[100001],head[100001],begin[100001],end[100001],apple[100001];
int c;
int lowbit(int x) {return x&-x;}
void add(int x,int v)
{for (;x<=n;x+=lowbit(x))tree[x]+=v;
}
int find(int x)
{int o=0;for (;x>0;x-=lowbit(x))o+=tree[x];return o;
}
void dfs(int x)
{begin[x]=tot;for (int i=head[x];i;i=edge[i].next) dfs(edge[i].to);end[x]=++tot;
}
int main()
{scanf("%d",&n);for (int i=1;i<n;i++){scanf("%d%d",&x,&edge[i].to);//邻接表优化遍历edge[i].next=head[x];head[x]=i;add(i,1);//边输入边初始化}add(n,1);dfs(1);//求先序后序遍历scanf("%d",&m);for (int i=1;i<=m;i++){scanf("\n%c %d",&c,&x);if (c=='C'){apple[x]^=1;//取反if (apple[x]) add(end[x],-1);//因为有苹果所以摘else add(end[x],1);//相反}else printf("%d\n",find(end[x])-find(begin[x]));}
}

这篇关于【树的遍历 树状数组】POJ_3321 Apple Tree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659168

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a