博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3321:Apple Tree(dfs序+树状数组)
阅读量:6161 次
发布时间:2019-06-21

本文共 1356 字,大约阅读时间需要 4 分钟。

题目大意:对树进行m次操作,有两类操作,一种是改变一个点的权值(将0变为1,1变为0),另一种为查询以x为根节点的子树点权值之和,开始时所有点权值为1。

分析:

  对树进行dfs,将树变为序列,记录每个点进栈出栈的时间戳作为其对应区间的左右端点,那么其子节点对应区间必在该区间内,对这段区间求和即可,用树状数组进行修改与求和。

代码:

program apple;type  point=^node;   node=record     x:longint; next:point;   end;var  a:array[0..100000]of point;  bit:array[0..200000]of longint;  b,v1,v2:array[0..100000]of longint;  g:array[0..100000]of boolean;  n,i,m,d,x,y:longint; c:char;procedure add(x,y:longint);var p:point;begin  new(p); p^.x:=y;  p^.next:=a[x]; a[x]:=p;end;procedure dfs(x:longint);var p:point;begin  inc(d); v1[x]:=d; g[x]:=true; new(p); p:=a[x];  while p<>nil do   begin     if g[p^.x]=false then dfs(p^.x); p:=p^.next;   end;  inc(d); v2[x]:=d;end;procedure change(x:longint);var i,y:longint;begin  y:=x;  if b[x]=0 then i:=1 else i:=-1;  x:=v1[x];  while (x<=2*n) do   begin inc(bit[x],i); inc(x,x and (-x));end;  b[y]:=1-b[y];end;function query(x:longint):longint;var s:longint;begin  s:=0;  while x>0 do   begin inc(s,bit[x]); dec(x,x and (-x)); end;  exit(s);end;begin  readln(n);  for i:=1 to n-1 do   begin     readln(x,y);     add(x,y);  add(y,x);   end;  d:=0; dfs(1);  for i:=1 to n do change(i);  readln(m);  for i:=1 to m do   begin     readln(c,x);     if c='C' then change(x)       else writeln(query(v2[x])-query(v1[x]-1));   end; end.
View Code

 

转载于:https://www.cnblogs.com/qtyytq/p/5645018.html

你可能感兴趣的文章
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
Spring常用注解
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>