poj3321
树映射到树状数组上
非常好的题目,给了我很多启发
题目要求动态求一个棵子树的节点个数
不禁联想到了前缀和,只要我们能用一个合适的优先级表示每个顶点,那么就好做了
我们可以考虑将子树表示成区间的形式
这个子树的根节点显然是区间的右端点,那么左端点一定是子树中编号最小的那个
这样问题就转化为区间求和,单点修改的问题了
很容易想到树状数组
我们可以用后序遍历树,这样映射到树状数组之后就好办了
type link=^node;
node=record
po:longint;
next:link;
end;
var w:array[..] of link;
c,h,f,a:array[..] of longint;
v:array[..] of boolean;
t,r,n,m,i,x,y:longint;
ch:char; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure add(x,y:longint);
var p:link;
begin
new(p);
p^.po:=y;
p^.next:=w[x];
w[x]:=p;
end; procedure dfs(i:longint); //映射
var tmp,y:longint;
p:link;
begin
v[i]:=true;
p:=w[i];
tmp:=n+;
while p<>nil do
begin
y:=p^.po;
if not v[y] then
begin
dfs(y);
if tmp>f[y] then tmp:=f[y];
end;
p:=p^.next;
end;
inc(t);
h[i]:=t;
if tmp<>n+ then
f[i]:=tmp
else f[i]:=h[i];
end; procedure work(x,f:longint);
begin
while x<=n do
begin
c[x]:=c[x]+f;
x:=x+lowbit(x);
end;
end; function ask(x:longint):longint;
begin
ask:=;
while x> do
begin
ask:=ask+c[x];
x:=x-lowbit(x);
end;
end; begin
readln(n);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
a[i]:=;
end;
a[n]:=;
dfs();
for i:= to n do
work(i,);
readln(m);
for i:= to m do
begin
readln(ch,r);
if ch='Q' then
begin
x:=f[r];
y:=h[r];
writeln(ask(y)-ask(x-));
end
else begin
x:=h[r];
if a[x]= then work(x,) //细节题目要求没苹果的时候加苹果
else work(x,-);
a[x]:=a[x] xor ;
end;
end;
end.
type link=^node;
node=record
po:longint;
next:link;
end;
var w:array[0..100100] of link;
c,h,f,a:array[0..100100] of longint;
v:array[0..100100] of boolean;
t,r,n,m,i,x,y:longint;
ch:char;
function lowbit(x:longint):longint;
begin
exit(x and (-x));
end;
procedure add(x,y:longint);
var p:link;
begin
new(p);
p^.po:=y;
p^.next:=w[x];
w[x]:=p;
end;
procedure dfs(i:longint); //映射
var tmp,y:longint;
p:link;
begin
v[i]:=true;
p:=w[i];
tmp:=n+1;
while p<>nil do
begin
y:=p^.po;
if not v[y] then
begin
dfs(y);
if tmp>f[y] then tmp:=f[y];
end;
p:=p^.next;
end;
inc(t);
h[i]:=t;
if tmp<>n+1 then
f[i]:=tmp
else f[i]:=h[i];
end;
procedure work(x,f:longint);
begin
while x<=n do
begin
c[x]:=c[x]+f;
x:=x+lowbit(x);
end;
end;
function ask(x:longint):longint;
begin
ask:=0;
while x>0 do
begin
ask:=ask+c[x];
x:=x-lowbit(x);
end;
end;
begin
readln(n);
for i:=1 to n-1 do
begin
readln(x,y);
add(x,y);
add(y,x);
a[i]:=1;
end;
a[n]:=1;
dfs(1);
for i:=1 to n do
work(i,1);
readln(m);
for i:=1 to m do
begin
readln(ch,r);
if ch='Q' then
begin
x:=f[r];
y:=h[r];
writeln(ask(y)-ask(x-1));
end
else begin
x:=h[r];
if a[x]=0 then work(x,1) //细节题目要求没苹果的时候加苹果
else work(x,-1);
a[x]:=a[x] xor 1;
end;
end;
end.
poj3321的更多相关文章
- poj3321 dfs序+树状数组单点更新 好题!
当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题 树的dfs序映射在树状数组上进行单点修改,区间查询. /* 树状数组: lowbit[i] = i&-i C[i] = a[i-l ...
- POJ3321 Apple Tree (JAVA)
树形数组题,有一定难度. 首先得搞清楚树形数组是什么 - 它是建立在原始数组上的统计数组 - 目的:方便对原始数组进行切片统计,主要用于统计切片的累加和 其实你可以对切片进行扫描,把元素一个一个加起来 ...
- poj3321(dfs序+树状数组)
题目链接:https://vjudge.net/problem/POJ-3321 题意:给一个普通树(不是二叉树),并且已经编号,每个结点为1或0,有两种操作,对单个结点修改和查询一个结点的子树的所有 ...
- 【POJ3321】Apple Tree(DFS序,树状数组)
题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000 思路:最近一段时间在思考树上统计问题的算法 发 ...
- [poj3321]Apple Tree_dfs序_树状数组
Apple Tree poj-3321 题目大意:给你一个根固定的树,每一个点的点权是0或1,查询子树点权和. 注释:$1\le n \le 10^5$. 想法:刚刚学习dfs序,刷到水题偶哈哈. 什 ...
- POJ3321 Apple Tree(树状数组)
先做一次dfs求得每个节点为根的子树在树状数组中编号的起始值和结束值,再树状数组做区间查询 与单点更新. #include<cstdio> #include<iostream> ...
- [poj3321]Apple Tree(dfs序+树状数组)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26762 Accepted: 7947 Descr ...
- POJ3321 Apple Tree(DFS序)
题目,是对一颗树,单点修改.子树查询.典型的dfs序入门题. DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护:感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的. ...
- POJ3321 Apple Tree (树状数组)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16180 Accepted: 4836 Descr ...
随机推荐
- php 批量替换html标签的实例代码
php批量替换html标签的实例代码分享. 1.把html元素全部去掉,或者保留某几个html标签 <?php $text = '<p>Test paragraph.</p ...
- 在AWS上安装laravel框架
博客已经迁移到www.imyzf.com,本站不再更新,请谅解! Laravel是现在非常热门的PHP框架,这几天我试着在亚马逊AWS的服务器上安装Laravel,遇到很多问题,最后还是成功了.我的系 ...
- Django1.6添加comments应用的简单过程
今天尝试为自己开发的博客加上评论功能,查看Django的文档,发现1.6之后Django不再自带comments这个app了,下面是官方文档上的说明: Django’s comment framewo ...
- hdu 4641 K-string SAM的O(n^2)算法 以及 SAM+并查集优化
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4641 题意:有一个长度为n(n < 5e4)的字符串,Q(Q<=2e5)次操作:操作分为:在末 ...
- 浅谈string
#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 using std::string;using ...
- fineui框架
http://fineui.com/demo/#/demo/layout/fit.aspx 虽然比较丑陋,但功能实用 此框架比较简单, 框架的作用你懂的,重点是要有帮助文档, 进阶型的容易上手的帮助文 ...
- EasyUI Layout Full - Not Correct in IE8
EasyUI Full布局在IE10,IE9下正常,IE8无效果,标记一下有知道的可以留个言! 如图 IE 10 IE 8
- 洛谷 P1858 多人背包
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...
- linux内核分析之进程地址空间管理
1.struct task_struct 进程内核栈是操作系统为管理每一个进程而分配的一个4k或者8k内存大小的一片内存区域,里面存放了一个进程的所有信息,它能够完整的描述一个正在执行的程序:它打开的 ...
- 1.2 XmlBeanFactory的实例化
源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐, 本文以spring框架的XmlBeanFactory为入手点 ...