POJ 3321 Apple Tree 树状数组 第一题
第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的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 树状数组 第一题的更多相关文章
- POJ 3321 Apple Tree(树状数组)
Apple Tree Time Limit: 2000MS Memory Lim ...
- POJ 3321 Apple Tree (树状数组+dfs序)
题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...
- POJ 3321 Apple Tree 树状数组+DFS
题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...
- 3321 Apple Tree 树状数组
LIANJIE:http://poj.org/problem?id=3321 给你一个多叉树,每个叉和叶子节点有一颗苹果.然后给你两个操作,一个是给你C清除某节点上的苹果或者添加(此节点上有苹果则清除 ...
- POJ 3321:Apple Tree 树状数组
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22131 Accepted: 6715 Descr ...
- POJ--3321 Apple Tree(树状数组+dfs(序列))
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...
- 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. ...
- POJ3321 Apple Tree(树状数组)
先做一次dfs求得每个节点为根的子树在树状数组中编号的起始值和结束值,再树状数组做区间查询 与单点更新. #include<cstdio> #include<iostream> ...
- POJ 3928 Ping pong 树状数组模板题
開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...
随机推荐
- Python 使用 requests 模块发送请求的使用及封装
一.requests 模块基本使用 1.准备接口的URL.请求参数.请求头 # 1. 构造注册.登录.充值请求的url register_url = "注册url" login_u ...
- 023、Java中String的用法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 017.Oracle数据库,取今年第一天,取今年最后一天
/*取今年第一天,取今年最后一天*/ SELECT trunc(sysdate, 'yyyy') AS 今年第一天 , add_months(trunc(sysdate, ) AS 今年最后一天 FR ...
- Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32
安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...
- oracle 导出时报错EXP-00011:table不存在
oracle11g,在用exp命令备份数据库时,如果表中没有数据报EXP-00011错误,对应的表不存在.这导致对应的空表无法备份. 原因:11g默认创建一个表时不分配segment,只有在插入数据时 ...
- XPath--快速获取XML数据的节点或属性
转载自 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" ...
- C#使窗体不显示在任务栏
this.ShowInTaskbar = false;///使窗体不显示在任务栏
- css 径向渐变
.example { width: 150px; height: 80px; background: -webkit-radial-gradient(red, green, blue); /* Saf ...
- Python 自省指南
原作者:Patrick K. O'Brien 什么是自省? 在日常生活中,自省(introspection)是一种自我检查行为.自省是指对某人自身思想.情绪.动机和行为的检查.伟大的哲学家苏格拉底将生 ...
- idea的简单使用
1.新建项目 (1)点击 file -->new project ,选择java(创建普通java项目) ,点next (2)不选择create project from template (不 ...