poj3321(dfs序+树状数组)
题目链接:https://vjudge.net/problem/POJ-3321
题意:给一个普通树(不是二叉树),并且已经编号,每个结点为1或0,有两种操作,对单个结点修改和查询一个结点的子树的所有结点的值。
思路:操作为单点操作和区间查询,很适合用树状数组或线段树来解,但是这里的区间查询并不具备减法规则,一个结点的子数的所有结点编号也不连续。
所以需要我们自己来重新给结点编号。这里利用dfs对树遍历一遍,使用一个时间戳(从1开始),在遍历一个结点开始和结束分别记录时间戳s[i],e[i],能够发现s[i]即为结点i的新编号,s[i]~e[i]即为结点i的管辖范围(就是以i为根的子数的所有结点编号所在区间)。文字描述很抽象,下面举个例子:
对于上面所示树,数字为题目给的编号。dfs的遍历顺序为
i: 1 2 5 6 3 7 4 8 9
(s[i],e[i]) (1,9) (2,4) (3,3) (4,4) (5,6) (6,6) (7,9) (8,8) (9,9)
遍历结点开始时的时间戳表示结点编号这个很自然,遍历完这个结点的子树之后的时间戳其实就是子树结点的最后一个编号,所以s[i]~e[i]表示其子树的编号区间,一个子树的编号也是连续的。
然后就可以利用树状数组来解决剩下的问题了,对单点进行修改,对一个结点的子树进行查询,结果就是query(e[i])-query(s[i]-1)。复杂度为O(nlogn)。
AC代码:
#include<cstdio>
using namespace std;
const int maxn=; struct node{
int v,next;
}edge[maxn<<]; int head[maxn],tr[maxn],s[maxn],e[maxn];
bool vis[maxn],a[maxn];
int n,m,cnt,tim; void add(int u,int v){
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
} void dfs(int p){
s[p]=++tim;
vis[p]=;
for(int i=head[p];i!=-;i=edge[i].next){
if(vis[edge[i].v]) continue;
dfs(edge[i].v);
}
e[p]=tim;
} int lowbit(int x){
return x&(-x);
} void update(int x,int num){
while(x<=n){
tr[x]+=num;
x+=lowbit(x);
}
} int query(int x){
int ans=;
while(x>){
ans+=tr[x];
x-=lowbit(x);
}
return ans;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
head[i]=-;
a[i]=;
update(i,);
}
for(int i=;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs();
scanf("%d",&m);
char c;
int t;
while(m--){
scanf(" %c%d",&c,&t);
if(c=='C'){
if(a[t]){
a[t]=;
update(s[t],-);
}
else{
a[t]=;
update(s[t],);
}
}
else{
printf("%d\n",query(e[t])-query(s[t]-));
}
}
return ;
}
poj3321(dfs序+树状数组)的更多相关文章
- poj3321 dfs序+树状数组单点更新 好题!
当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题 树的dfs序映射在树状数组上进行单点修改,区间查询. /* 树状数组: lowbit[i] = i&-i C[i] = a[i-l ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- 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 ...
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
- 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- [BZOJ1103][POI2007]大都市meg dfs序+树状数组
Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)
题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...
随机推荐
- CreateRemoteThread 远程dll注入
1.dll中的内容 // dllmain.cpp : 定义 DLL 应用程序的入口点.#include "stdafx.h" BOOL APIENTRY DllMain( HMOD ...
- 初识DDD
DDD强调专注于业务问题域的需要:其专业术语.为何开发该软件的关键原因,以及对于业务来说什么才是成功 问题域涉及你当前正在构建软件的主题领域 DDD强调的是,在致力于为大型复杂业务系统创建软件时,专注 ...
- LAMP 2.2 Apache配置静态缓存
这里的静态文件指的是图片.js.css 等文件,用户访问一个站点,其实大多数元素都是图片.js.css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器 ...
- springBoot数据库jpa+对接mybatis
1 spring Data jpa hibernate引领数据访问技术,使用orm对象关系映射来进行数据库访问,通过模型和数据库进行映射,通过操作对象实现对数据库操作,把数据库相关操作从代码中独立出 ...
- Maven学习笔记1-牛逼的POM文件
IDE:integrated development enterprise 集成开发环境: 一.pom文件 POM是项目对象模型(Project Object Model)的简称:maven世界中必须 ...
- SQL查询语句 [2]
一.快捷查询 快捷查询方式是一种多字段查询的简化写法,在多个字段之间用'|'隔开表示OR,用'&'隔开表示 AND. 1.不同字段相同查询条件 在 Home/controller/UserC ...
- vue安装vuex框架
1.安装vuex npm install vuex --save-dev 2.创建storesrc下创建stores文件夹,创建noteStore.js import Vue from 'vue'; ...
- Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介
用Python构建一个SSH僵尸网络 01 简介 一. 构建一个SSH僵尸网络的流程图: Created with Raphaël 2.1.0手动操作,实现通过SSH连接目标服务器(手动)用 Pexp ...
- 联想《拯救者》U盘UEFI启动装win7[完美激活](4)
引用这篇文章 http://www.nwmie.com.cn/jiaocheng/1394.html 我们常常不想把自己的电脑从GUID分区方式改到MBR,但是这样装完win7无法激活,embarra ...
- setex()
设置值和有效期 $redis->setex($key, $expire, $value);//$expire,有效期,单位秒 相当于 SET key value//设置键值 EXPIRE key ...