第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和。

这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历来做,后来用树状数组做完都跑了600+MS,那样估计是TLE了。

做法就是用DFS把整个图重建一遍,代号小的点在叶子,代号大的点为根。记录每个根的起始点号为 idl,根点号为 idh,则求某个根的苹果和就直接调用树状数组的sum即可。

不过前提是要建好树,我一开始不明白为什么要建一颗标准树,即就是按1 2 3 4。。。。,每个点有一个苹果的递增的标准树,因为整个图并不是按这个标准来建得,2号点C值为1号和2号的和,但实际的树可能1号和2号都是叶子啊。。。。后来想清楚了,每次求和都是建立在某个根上,而这个根和它的所有孩子是符合标准树状数组的。

#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
int u[N],v[N],nt[N],ft[N],idh[N],idl[N],cnt,isapple[N],c[N];
void add(int a,int b)
{
u[cnt]=a;
v[cnt]=b;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
int n;
void dfs(int x)
{
idl[x]=cnt;
if (ft[x]==-)
{
idh[x]=cnt++;
return;
}
for (int i=ft[x];i>=;i=nt[i])
{
int nx=v[i];
dfs(nx);
}
idh[x]=cnt++;
}
int lowbit(int x)
{
return x & (-x);
}
void update(int x)
{
int d;
if (isapple[x])
{
d=-;
isapple[x]^=;
}
else
{
d=;
isapple[x]^=;
}
while (x<=n)
{
c[x]+=d;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ret=;
while (x>)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
int m;
while (scanf("%d",&n)!=EOF)
{
cnt=;
int a,b;
memset(ft,-,sizeof ft);
memset(c,,sizeof c);
for (int i=;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
}
cnt=;
dfs();
for (int i=;i<=n;i++)
{
isapple[i]=;
update(i);
}
//puts("pp");
scanf("%d",&m);
char ch[];
int nt;
while (m--)
{
// puts("pass");
scanf("%s%d",ch,&nt);
//puts(ch);
if (ch[]=='Q')
{
int ans=getsum(idh[nt])-getsum(idl[nt]-);//求结果的时候就求根的sum以及最小叶子的前一点,相减就是该棵树的和,就跟前缀和一样的原理
printf("%d\n",ans);
}
else
{
update(idh[nt]);
}
//getchar();
}
}
return ;
}

POJ 3321 Apple Tree 树状数组 第一题的更多相关文章

  1. POJ 3321 Apple Tree(树状数组)

                                                              Apple Tree Time Limit: 2000MS   Memory Lim ...

  2. POJ 3321 Apple Tree (树状数组+dfs序)

    题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...

  3. POJ 3321 Apple Tree 树状数组+DFS

    题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...

  4. 3321 Apple Tree 树状数组

    LIANJIE:http://poj.org/problem?id=3321 给你一个多叉树,每个叉和叶子节点有一颗苹果.然后给你两个操作,一个是给你C清除某节点上的苹果或者添加(此节点上有苹果则清除 ...

  5. POJ 3321:Apple Tree 树状数组

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22131   Accepted: 6715 Descr ...

  6. POJ--3321 Apple Tree(树状数组+dfs(序列))

    Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...

  7. E - Apple Tree(树状数组+DFS序)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  8. POJ3321 Apple Tree(树状数组)

    先做一次dfs求得每个节点为根的子树在树状数组中编号的起始值和结束值,再树状数组做区间查询 与单点更新. #include<cstdio> #include<iostream> ...

  9. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

随机推荐

  1. Python 使用 requests 模块发送请求的使用及封装

    一.requests 模块基本使用 1.准备接口的URL.请求参数.请求头 # 1. 构造注册.登录.充值请求的url register_url = "注册url" login_u ...

  2. 023、Java中String的用法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  3. 017.Oracle数据库,取今年第一天,取今年最后一天

    /*取今年第一天,取今年最后一天*/ SELECT trunc(sysdate, 'yyyy') AS 今年第一天 , add_months(trunc(sysdate, ) AS 今年最后一天 FR ...

  4. Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32

    安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...

  5. oracle 导出时报错EXP-00011:table不存在

    oracle11g,在用exp命令备份数据库时,如果表中没有数据报EXP-00011错误,对应的表不存在.这导致对应的空表无法备份. 原因:11g默认创建一个表时不分配segment,只有在插入数据时 ...

  6. XPath--快速获取XML数据的节点或属性

    转载自 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" ...

  7. C#使窗体不显示在任务栏

    this.ShowInTaskbar = false;///使窗体不显示在任务栏

  8. css 径向渐变

    .example { width: 150px; height: 80px; background: -webkit-radial-gradient(red, green, blue); /* Saf ...

  9. Python 自省指南

    原作者:Patrick K. O'Brien 什么是自省? 在日常生活中,自省(introspection)是一种自我检查行为.自省是指对某人自身思想.情绪.动机和行为的检查.伟大的哲学家苏格拉底将生 ...

  10. idea的简单使用

    1.新建项目 (1)点击 file -->new project ,选择java(创建普通java项目) ,点next (2)不选择create project from template (不 ...