【POJ No. 3321】 子树查询 Apple Tree

news2024/11/27 22:26:32

【POJ No. 3321】 子树查询 Apple Tree

北大OJ 题目地址

在这里插入图片描述

【题意】

在卡卡的房子外面有一棵苹果树,树上有N 个叉(编号为1~N ,根为1),它们通过分支连接。苹果在叉上生长,两个苹果不会在同一个叉上生长。一个新的苹果可能会在一个空叉上长出来,卡卡还可能会从树上摘一个苹果作为他的甜点。

卡卡想了解一棵子树上有多少苹果。

在这里插入图片描述

【输入输出】

输入:

第1行包含一个整数N (N ≤100,000),表示树中叉的数量。以下N -1行,每行都包含两个整数u 和v ,表示叉u 和叉v 通过分支连接。下一行包含整数M (M ≤100,000)。以下M 行,每行都包含一个消息,C x 表示改变x 叉上的苹果状态。若叉上有苹果,则卡卡会选择摘掉它,否则一个新的苹果在这个空叉上长大;Q x 表示查询x 叉上方子树中的苹果数量,包括x 叉上的苹果(若存在)。

注意:开始时树上长满了苹果。

输出:

对每个查询,都单行输出答案。

【样例】

在这里插入图片描述

【思路分析】

本题包含两种操作,一种是点更新,一种是查询以当前节点为根的子树的苹果数量。

点更新很简单,那么如何得到以当前节点为根的子树的苹果数量呢?

若将一棵树深度遍历,则记录遍历时当前节点进来和出去时的序号,两个序号之间的节点就是当前节点的子树节点。可以利用DFS序将子树转换为序列,然后求解区间和。

【算法设计】

① 根据输入的分支构建树。

② 采用深度遍历求树的DFS序列,记录进出i 节点的序号L[i ]和R[i ]。

③ Q x :查询以x 节点为根的子树中的苹果数量,只需计算进出x 节点的区间和[L[x ], R[x ]],即sum(R[x ])-sum(L[x ]-1)。

④ C x :若判断x 节点的值为1,则在树状数组中点更新-1,否则+1。然后a [x ]^=1,进行异或运算,1变为0,0变为1。

【举个栗子】

输入数据如下。

在这里插入图片描述

① 构建一棵树,深度优先遍历的dfs序列如下图所示。

在这里插入图片描述

② 节点i 进来和出去时的序号如下:

在这里插入图片描述

③ 查询或更新操作。

  • Q 1:查询以1号节点为根的子树中的苹果数量。1号节点的进出序号为L[1]=1,R[1]=5,查询[1, 5]的区间和,sum(R[1])-sum(L[1]-1)=5-0=5,所以1号节点的子树中的苹果数量为5。

  • Q 3:查询以3号节点为根的子树中的苹果数量。3号节点的进出序号为L[3]=3,R[3]=5,查询[3, 5]的区间和,sum(R[3])-sum(L[3]-1)=5-2=3。所以3号节点的子树中的苹果数量为3。

  • C 2:改变2号节点的苹果状态。2号节点有苹果(值为1),在树状数组中点更新-1,然后a [2]^=1,进行异或运算,1变为0,0变为1,此时a [2]=0。

  • Q 1:查询以1号节点为根的子树中的苹果数量,1号节点的进出序号为L[1]=1、R[1]=5,查询[1, 5]的区间和,sum(R[1])-sum(L[1]-1)=4-0=5。所以1号节点的子树中的苹果数量为4。

【算法实现】

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

const int maxn=1e5+10;

int N,q;
int c[maxn];
int a[maxn];
int L[maxn],R[maxn];
int head[maxn];
int cnt;
int dfn;

struct edge{
    int u,v;
    int next;
}E[2*maxn];

void adde(int u,int v){
    E[++cnt].u=u;
    E[cnt].v=v;
    E[cnt].next=head[u];
    head[u]=cnt;
}

int lowbit(int x){
    return x&(-x);
}

void add(int i,int v){
    for(;i<=N;i+=lowbit(i))
        c[i]+=v;
}

int sum(int i){
    int ans=0;
    for(;i>0;i-=lowbit(i)){
        ans+=c[i];
    }
    return ans;
}

void init(){
    memset(c,0,sizeof(c));
    memset(L,0,sizeof(L));
    memset(R,0,sizeof(R));
    memset(head,0,sizeof(head));
    cnt=0;
    dfn=1;
    for(int i=1;i<=N;i++){
        a[i]=1;
        add(i,1);
    }
}

void dfs(int u,int fa){
    L[u]=dfn++;
    for(int i=head[u];i;i=E[i].next){
        int v=E[i].v;
        if(v==fa) continue;
        dfs(v,u);
    }
    R[u]=dfn-1;
}

int main(){
    scanf("%d",&N);
    int u,v;
    init();
    for(int i=1;i<N;i++){
        scanf("%d%d",&u,&v);
        adde(u,v);
    }
    dfs(1,1);
	
    scanf("%d",&q);
    char op[10];
    for(int i=1;i<=q;i++){
        scanf("%s %d",op,&v);
        if(op[0]=='C'){
            if(a[L[v]])
                add(L[v],-1);
            else
                add(L[v],1);
            a[L[v]]^=1;
        }
        else{
            int s1=sum(R[v]);
            int s2=sum(L[v]-1);
            printf("%d\n",s1-s2);
        }
    }
	
    return 0;
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1000道最新高频Java面试题,覆盖25个技术栈,从底层原理到架构

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff0c…

【外卖项目实战开发四】

文章目录菜品管理业务开发文件上传下载文件上传介绍文件下载介绍文件上传代码实现文件下载代码实现新增菜品需求分析数据模型代码开发-准备工作代码开发-梳理交互过程菜品信息分页查询需求分析代码开发-梳理交互过程修改菜品需求分析代码开发-梳理交互过程停售/起售菜品&#x…

阿里P8大牛总结的Java锁机制入门笔记,堪称教科书式天花板

前言 锁机制无处不在&#xff0c;锁机制是实现线程同步的基础&#xff0c;锁机制并不是Java锁独有的&#xff0c;其他各种计算机语言中也有着锁机制相关的实现&#xff0c;数据库中也有锁的相关内容。这篇文章就是从Java入手&#xff0c;深入学习、理解Java中的锁机制&#xf…

【Android App】实战项目之实现你问我答的智能语音机器人(超详细 附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、需求描述 想必大家都见过商场里的智能语音机器人&#xff0c;你对它提问时它可以自动回答你的问题&#xff0c;接下来我们也实现这样一个机器人&#xff0c;它依靠语音技术完成问询服务 基本功能如下 1&#xff1a;接收人们…

智能家居—— 树莓派摄像头捕捉人脸并识别

文章目录下载安装mjpg-streamer树莓派安装libcurl库树莓派安装openssl库语音控制开启摄像头线程拍照代码及步骤语音控制摄像头拍照camera.ccontrolDevice.h下载安装mjpg-streamer 参考博文&#xff1a;智能家居 —— 树莓派下载安装mjpg-streamer&#xff08;完成拍照录像监控…

市面上真正的全光谱灯品牌有哪些?全光谱护眼照明灯的作用很明显

众所周知&#xff0c;人眼感知任何事物都离不开光线的照射&#xff0c;但很多人可能不知道&#xff0c;光线不仅可以使我们“看得见”&#xff0c;还可以决定我们是否看得“真实”&#xff0c;这是怎么回事呢&#xff1f;其实这就是光线的色谱丰富度的问题。 人眼感知最舒适的光…

堆、堆排序、堆应用

一、概述 “堆”&#xff08;Heap&#xff09;&#xff0c;原地排序、时间复杂度O(nlogn)的排序算法。 堆是一个完全二叉树&#xff1b;堆中每一个节点的值都必须大于等于&#xff08;或者小于等于&#xff09;其子树中每个节点的值&#xff1b; 二、如何实现一个堆 使用数…

第2-4-7章 docker安装WorkBench-规则引擎Drools-业务规则管理系统-组件化-中台

文章目录8. WorkBench8.1 WorkBench简介8.2 安装方式8.2.1 传统方式安装8.2.2 docker安装drools workbench8.3 使用方式8.3.1 创建空间、项目8.3.2 创建数据对象8.3.3 创建DRL规则文件8.3.4 创建测试场景8.3.5 设置KieBase和KieSession8.3.6 编译、构建、部署8.3.7 在项目中使用…

Intel PAUSE 指令变化如何影响 MySQL 的性能

导读 x86、arm指令都很多&#xff0c;无论是应用程序员还是数据库内核研发大多时候都不需要对这些指令深入理解&#xff0c;但是 Pause 指令和数据库操作太紧密了&#xff0c;本文通过一次非常有趣的性能优化来引入对 Pause 指令的理解&#xff0c;期望可以事半功倍地搞清楚 C…

微服务线上问题排查困难?不知道问题出在哪一环?那是你还不会分布式链路追踪

咱们以前单体应用里面有很多的应用和功能&#xff0c;依赖各个功能之间相互调用&#xff0c;使用公共的代码包等等&#xff0c;排查问题&#xff0c;使用类似于 gdb/dlv 工具或者直接查看代码日志&#xff0c;进行定位和分析 但是现在我们基本上都是微服务架构了&#xff0c;将…

Node.js 入门教程 20 查看 npm 包安装的版本 21 安装 npm 包的旧版本

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程20 查看 npm 包安装的版本21 安装 npm 包的旧版本20 查看 npm 包安装的版本 若要查看所有已安装的 npm 软件包&#xff08…

JetpackCompose Navigation导航快速上手

Navigation 快速上手 下面案例简要展示使用 Compose 版本的 Navigation 库来实现两个页面之间的跳转 这是完整的结构&#xff08;忽略掉红线划过的那个包&#xff09; 编写欲跳转的两个页面 编写 Demo1 页面 子页面使用多个 composable 组件相组合的方法一一装配起来 Demo1m…

【博客543】golang pprof性能调试:寻找cpu瓶颈

golang pprof性能调试&#xff1a;寻找cpu瓶颈 1、引入pprof进行性能调试 在代码中加入&#xff1a; import _ "net/http/pprof"go func() {http.ListenAndServe("0.0.0.0:8899", nil) }()示例&#xff1a;为冒泡排序加入pprof debug package mainimpo…

月薪2万的大数据职位,为什么必须学习Python?

前言 马云说&#xff1a;“未来最大的资源就是数据&#xff0c;不参与大数据十年后一定会后悔。”毕竟出自wuli马大大之口&#xff0c;今年二月份我开始了学习大数据的道路&#xff0c;直到现在对大数据的学习脉络和方法也渐渐清晰。 我们先来看一下数据分析相关职位现在的薪…

Cys(Npys)-(Arg)₉,H2N-C(Npys)-RRRRRRRRR-OH

可渗透细胞的非精氨酸酰胺&#xff0c;可以很容易地偶联到负载分子上&#xff0c;例如通过马来酰亚胺-硫醇偶联。 编号: 126721中文名称: Cys(Npys)-(Arg)₉英文名: Cys(Npys)-(Arg)₉单字母: H2N-C(Npys)-RRRRRRRRR-OH三字母: H2N-Cys(Npys)-Arg-Arg-Arg-Arg-Arg-Arg-Arg-Arg-…

多肽标签TC tag,H2N-CCPGCC-OH

编号: 168488中文名称: 多肽标签TC tag英文名: TC tag单字母: H2N-CCPGCC-OH三字母: H2N-Cys-Cys-Pro-Gly-Cys-Cys-COOH氨基酸个数: 6分子式: C19H32N6O7S4平均分子量: 584.75精确分子量: 584.12等电点(PI): 9.13pH7.0时的净电荷数: 3.85平均亲水性: -1疏水性值: 1.33来源: 人工…

Vision Transformer

Vision Transformer 将Transformer应用于CV领域。 不了解Transformer的先去看下&#xff1a;一文看懂Transformer 对比Transformer&#xff0c;ViT的特殊之处不多。因为作者说了他们想要做“尽量少的改动”将Transformer直接应用于图像领域 论文下载地址&#xff1a;https:…

留学Paper写作需要怎么正确引用?

1.MLA文献引用格式的基本描述&#xff1a;文学类Paper通常使用MLA&#xff08;Modern Language Association&#xff09;格式。作者在正文中用括号夹注的形式注明参考文献的简要出处&#xff0c;即&#xff08;作者姓氏页码&#xff09;。 Ancient writers attributed the inve…

小学生python游戏编程arcade----坦克换色

小学生python游戏编程arcade----坦克换色前言坦克换色1、RGB颜色1.1 RGB1.2 PIL 模块中的image1.3 效果图![在这里插入图片描述](https://img-blog.csdnimg.cn/f533a0bed98f4b49a462a2f056c35786.png)#### 1.4 代码实现1.5 总结2、RGB转换为HSV2.1 RGB2.2 HSV2.3 python RGB 转…

《前端框架开发技术》HTML+CSS+JavaScript 制作个人简历模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…