当前位置: 首页 > 编程日记 > 正文

poj 3321 Apple Tree

树状数组

题意:一个树,以树枝连接两个点的形式给出,固定以1为整棵树的根。苹果长在树的节点上,节点上只可能0或1个苹果,一开始每个节点都有1个苹果

有两种操作,C表示更改某个节点的苹果数,0变1,1变0。Q表示查询,某个节点(包括)的子树上一共有多少个苹果

这题是选拔赛时候的题,一看,单点修改,区间查询?线段树?后来一直没想出来,今天看解题报告才明白真的是,不过是树状数组(不过按照理论来将,凡是树状数组能解决的问题,线段树都可以解决,反之不然)。整个问题最难的时候怎么映射成树状数组,映射后,只是树状数组的模板操作

1.首先数据太大,不用显式建树,只是用vector来保存边的信息,仅仅是利用vector来遍历二叉树,而且是后序遍历

2.

后序遍历二叉树,并按照遍历顺序重新给节点标号,那么有几个较为容易理解的结论
1.根节点的标号一定比所有子孙后代节点的标号大
2.但是标号比根节点小的节点不一定是根节点的子孙后代
3.根节点的子孙后代一定是和根节点的标号是连着的,根节点的标号为a,子孙后代节点标号范围在[b,a-1],是一段连续的区间
上面这3点比较容易想到,基于上面这3点,我们不难提出一个问题,怎么确定哪些标号是根节点的子孙后代呢?即第3条结论的b要怎么确定呢?
用时间戳来记录,或者说简单点就是访问的顺序(或说)深度来表示
起始时间为0,每访问到一个节点其实就是花费了一个时间,记录下第1次访问到该节点的时间。另外,当最后一次回到该节点时(即访问完所有的子孙后代),
记录一下时间,其实也就是后序遍历时给这个节点标号,这两步是同时进行的。
那么我们就可以知道了一个节点第一次被访问的时间,和最后离开该节点的时间,这两个时间相减得到一个时间差,在这段时间里我们只做了什么?
没错,就是访问了该节点的子孙后代!所有,标号在该差值范围内的节点就是该节点的子孙后代

所以查询的时候,我们要的不是前缀和,只是要区间和,而区间和可以由两个前缀和相减所得

sum[num[u]] - sum[num[u]-x'-1] ,x'=last[u]-first[u]

今天很累不想说了,剩下的看代码吧,应该能看懂的。。。。

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 100010int time,ccount;
bool vis[N]; //dfs的标记数组
bool app[N]; //每个点是否有苹果
typedef vector<int> INF;
vector<INF> e(N);
int first[N],last[N],num[N]; //第一次访问和离开一个节点的时间,后序遍历该节点的编号
int C[N]; //映射后的树状数组int lowbit(int x)
{return x&(-x);
}void init(int n)
{for(int i=0; i<=n; i++){app[i]=true;C[i]=lowbit(i); //因为一开每个点都有1个苹果所以可以初始化不用沿路径更新
    }
}void build(int n)
{for(int i=1; i<n; i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);}
}void dfs(int u)
{vis[u]=true;first[u]=++time; //记录第一次访问该节点的时间int size=e[u].size();for(int i=0; i<size; i++){int v=e[u][i];if(!vis[v]) dfs(v);}last[u]=time; //记录最后一次访问该节点的时间num[u]=++ccount;
}int sum(int pos)
{int ans=0;while(pos){ans += C[pos];pos -= lowbit(pos);}return ans ;
}void updata(int pos , int n)
{int val;if(!app[pos]) { app[pos]=true;  val=1;  } else          { app[pos]=false; val=-1; }while(pos<=n){C[pos] += val;pos += lowbit(pos);}
}int main()
{int n;scanf("%d",&n);build(n); //建树存边
    init(n);time=ccount=0; //时间戳和节点标号memset(vis,false,sizeof(vis));dfs(1);char str[3]; int M,m;scanf("%d",&M);for(int i=0; i<M; i++){scanf("%s%d",str,&m);if(str[0]=='C') updata(num[m],N-10);else{int s1=sum( num[m] );int s2=sum( num[m] -(last[m]-first[m]) -1 );printf("%d\n",s1-s2);}}return 0;
}

相关文章:

人工智能在网络贷款中鲜为人知的事

作者 | Laksh Mohan翻译| 火火酱~&#xff0c;责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国现在&#xff0c;科技已经成为推动企业发展壮大的基本要素之一。人工智能&#xff08;AI&#xff09;就是一个证明此类技术在商业领域走红的好例子&#xff0c;比如网络…

《HTML5与CSS3实战指南》——2.5 构建The HTML5 Herald

本节书摘来自异步社区《HTML5与CSS3实战指南》一书中的第2章&#xff0c;第2.5节,作者&#xff1a; 【美】Estelle Weyl , Louis Lazaris , Alexis Goldstein 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.5 构建The HTML5 Herald 我们已经介绍了页面结构的基础以及…

用.NET创建Windows服务

用.NET创建Windows服务 译者说明&#xff1a;我是通过翻译来学习C&#xff03;的&#xff0c;文中涉及到的有Visual Studio.NET有关操作&#xff0c;我都根据中文版的VS.NET显示信息来处理的&#xff0c;可以让大家不致有误解。作者&#xff1a;Mark Strawmyer 我们将研究如何…

BGP local-preference MED属性实验

实验拓扑 实验配置 建立两个AS 65001、65000 AS65000内跑OSPF&#xff0c;并在R1上发布三个网段100.1.1.1 100.1.2.1 100.1.3.1 在R3 R5上聚合后发布给R4。 每台路由器都有一个对应的loopback地址。 实验过程 <R1>dis bgp ro Total Number of Routes: 10 BGP Local route…

加速产业生态算力升级,华为鲲鹏展翅福州

11月20日&#xff0c;为了让更多开发者了解鲲鹏计算生态体系&#xff0c;并且助力行业人才培养&#xff0c;由福建鲲鹏生态创新中心、福州市大数据基地开发有限责任公司联合举办的鲲鹏开发者训练营圆满完成。此次活动现场吸引到了大量的开发者参与&#xff0c;产、学、研各界人…

《CCNP TSHOOT 300-135认证考试指南》——2.2节故障检测与排除及网络维护工具箱

本节书摘来自异步社区《CCNP TSHOOT 300-135认证考试指南》一书中的第2章&#xff0c;第2.2节故障检测与排除及网络维护工具箱&#xff0c;作者 【加】Raymond Lacoste , 【美】Kevin Wallace&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 故障检测与排…

在linux系统下实现音视频即时通讯的部分代码

由于使用习惯,Linux在中国受欢迎程度远不如windows&#xff0c;相应的软件也比较少&#xff0c;尤其是音视频类的软件&#xff0c;但是&#xff0c;这并不代表就完全没有。下面介绍一款强大的音视频即时通讯平台给大家&#xff0c;它就是——Anychat for Linux SDK。AnyChat是一…

文本分类六十年

作者 | Lucy出品 | AI科技大本营文本分类是自然语言处理中最基本而且非常有必要的任务&#xff0c;大部分自然语言处理任务都可以看作是个分类任务。近年来&#xff0c;深度学习所取得的前所未有的成功&#xff0c;使得该领域的研究在过去十年中保持激增。这些文献中已经提出了…

web service 和 remoting 有什么区别

其实现的原理并没有本质的区别&#xff0c;在应用开发层面上有以下区别&#xff1a;1、Remoting可以灵活的定义其所基于的协议&#xff0c;如果定义为HTTP&#xff0c;则与Web Service就没有什么区别了&#xff0c;一般都喜欢定义为TCP&#xff0c;这样比Web Service稍为高效一…

《实施Cisco统一通信管理器(CIPT1)》一2.4 使用分布式呼叫处理的多站点WAN部署模型...

本节书摘来异步社区《实施Cisco统一通信管理器&#xff08;CIPT1&#xff09;》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a; 【美】Dennis Hartmann译者&#xff1a; 刘丹宁 , 陈国辉 , 卢铭 责编&#xff1a; 傅道坤, 更多章节内容可以访问云栖社区“异步社…

【转】 LDA必读的资料

时间总是不够用&#xff0c;这里就不自己写了&#xff0c;摘自一篇转发的博客&#xff0c;感觉挺有用&#xff01; 一个大牛写的介绍&#xff0c;貌似需FQ http://tedunderwood.wordpress.com/2012/04/07/topic-modeling-made-just-simple-enough/David M.Blei主页&#xff1a;…

sizeof 操作符详解

1. 定义&#xff1a; sizeof是何方神圣&#xff1f; sizeof 乃 C/C 中的一个操作符&#xff08;operator&#xff09;是也。简单说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为&#xff1a; The sizeof keyword gives the amount of storage, in bytes, a…

石锤!谷歌排名第一的编程语言,死磕这点,程序员都收益

日本最大的证券公司之一野村证券首席数字官马修汉普森&#xff0c;在Quant Conference上发表讲话&#xff1a;“用Excel的人越来越少&#xff0c;大家都在码Python代码。”甚至直接说&#xff1a;“Python已经取代了Excel。”事实上&#xff0c;为了追求更高的效率和质量&#…

《关系营销2.0——社交网络时代的营销之道》一T表示Technology(技术)

本节书摘来异步社区《关系营销2.0——社交网络时代的营销之道》一书中的第1章&#xff0c;作者&#xff1a; 【美】Mari Smith 译者&#xff1a; 张猛 , 于宏 , 赵俐 责编&#xff1a; 陈冀康, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 T表示Technology&#xff…

jquery拖拽实现UI设计组件

想做一个UI设计的组件&#xff0c;左侧是控件列表&#xff0c;右边是编辑区域&#xff0c;左侧的控件可以重复拖拽到右侧然后进行编辑。 效果草图&#xff1a; 部分js代码&#xff1a; function domop(){//set drag and drop $( "#compls .component" ).each(functi…

六年磨一剑,全时发布音视频会议平台TANG,多款新品亮相

作者 | 高卫华出品 | AI科技大本营时隔六年&#xff0c;全时于11月26日在北京举办了“时间的力量2020新产品发布会“。发布会现场&#xff0c;全时创始人&CEO陈学军回顾了全时近年来的发展历程&#xff0c;并正式推出了全时云会议2020版&#xff0c;全时小智和全时云直播三…

考察新人的两道c语言题目

1> 如何判断一个板子的cpu 是big-endian 还是 Little&#xff0d;endian的&#xff1f;用c实现非常简单&#xff0c;10行左右&#xff0c;就可以判断了&#xff0c; 关键考察新人是否了解了什么是endian &#xff0c;big-endian与little-endian的区别在哪里&#xff0c; 如果…

《Adobe After Effects CC经典教程》——导读

前 言 After Effects CC提供了一套完整的2D和3D工具&#xff0c;动态影像专业人员、视频特效艺术家、网页设计人员以及电影和视频专业人员都可以用这些工具创建合成图像、动画和特效。After Effects被广泛应用于电影、视频、DVD以及Web的后期数字制作之中。After Effects可以以…

scanf()函数的用法和实践

scanf()函数的用法和实践摘要&#xff1a; 本文阐述了基于ANSI&#xff0c;Win 95&#xff0c;Win NT上的 C/C语言中scanf()函数的用法&#xff0c;以及在实际使用中常见错误及对策。 关键词&#xff1a; scanf()一、 序言 在CSDN论坛的C/C版块&#xff0c;我时常见…

邢波出任全球第一所AI大学校长,履历横跨三门学科

整理 | 高卫华出品 | AI科技大本营近日&#xff0c;世界上第一家研究型人工智能大学——Mohamed bin Zayed University of Artificial Intelligence&#xff0c;简称MBZUAI大学&#xff08;MBZUAI&#xff09;&#xff0c;任命著名华人AI学术教授邢波为校长。据悉&#xff0c;首…

Ubuntu 10.10 安装 libx11-dev

今天&#xff08;2013-04-11&#xff09;尝试安装 ImageMagick&#xff0c;结果发现 config.log 文件中包含了如下错误信息&#xff1a; fatal error: X11/Xlib.h: No such file or directory 也就是说缺少了 libx11-dev 包&#xff0c;心想这有什么难的&#xff0c;直接通过 a…

《计算机组成原理》----2.6 浮点数

本节书摘来自华章出版社《计算机组成原理》一书中的第2章&#xff0c;第2.6节&#xff0c; 作 者 Computer Organization and Architecture: Themes and Variations&#xff3b;英&#xff3d;艾伦克莱门茨&#xff08;Alan Clements&#xff09; 著&#xff0c;沈 立 王苏峰…

javascript/dom:原生的JS写选项卡方法

来源:http://www.jb51.net/article/30108.htm <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-…

CSDN 星城大巡礼,长沙“科技之星”年度企业评选正式开启

2020年&#xff0c;长沙市委主要领导发出“软件产业再出发”的号召&#xff0c;颁布了软件三年行动计划。今年5月&#xff0c;CSDN 作为专业的 IT 社区&#xff0c;与长沙高新区签约&#xff0c;将全国总部落户长沙&#xff0c;这一战略决策&#xff0c;让CSDN与长沙的联结进一…

Linux下用C获取当前系统时间

#include <time.h> time_t time(time_t calptr); 返回的是日历时间&#xff0c;即国际标准时间公元1970年1月1日00 : 00 : 00以来经过的秒数。然后再调用 char *ctime(const time_t calptr) ; 转化为字符串表示 #include <stdio.h> #inc…

Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

计划按例如以下顺序完毕这篇笔记&#xff1a;Java程序猿的JavaScript学习笔记&#xff08;1——理念&#xff09; Java程序猿的JavaScript学习笔记&#xff08;2——属性复制和继承&#xff09; Java程序猿的JavaScript学习笔记&#xff08;3——this/call/apply&#xff09; J…

关于动态规划,你想知道的都在这里了!

作者 | Your DevOps Guy翻译| 火火酱~&#xff0c;责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国什么是动态规划&#xff1f;它又有什么重要的呢&#xff1f;在本文中&#xff0c;我将介绍由Richard Bellman在20世纪50年代提出的动态规划&#xff08;dynamic pro…

Tcpdump命令的使用与示例——linux下的网络分析

顾名思义&#xff0c;TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种免费的网络分析工具&#xff0c;尤其其提供了源代码&a…

document.getElementById与getElementByName的区别

document.getElementById( "id_Number ") 得到的是单个元素 document.getElementsByName( "name ") 得到的是数组 转载于:https://www.cnblogs.com/qiuh/archive/2013/04/16/3023596.html

HDU 3507:Print Article

HDU 3507&#xff1a;Print Article 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid3507 题目大意&#xff1a;给定$n$&#xff0c;$m$&#xff0c;输出序列$n$个数&#xff0c;每连续输出代价为连续输出的数字和的平方加上$m$. 斜率优化DP 定义$sum_{pq}\su…