题目链接

题意:一开始1-n都有苹果,Q查询以x为根下存在多少。

树状数组+DFS+队列转换

这题纠结了2天,一开始一点思路都没有,看大神都是吧树状数组转换成队列来做

看了好久都不知道怎么转换的,

解决方法:用两个队列,一个是以记录(s,u),s为起点,一个记录s,为终点

用DFS查找一棵分支,记录访问次序,这样就可以转换成树状数组了

#include <cstdio> //参照大神的代码
#include <cstring>
using namespace std;
#define N 500000
int tree[N],b[N],e[N],head[N]; //b记录DFS访问的次序,e表示当前节点DFS的最后一个节点标号
bool h[N],v[N]; //v[i]表示是否被访问过
int num;
struct node
{
int x,next;
}a[N];
inline int lowbit(int x) {return x&-x;}
void update(int x,int t)
{
int n;
if(h[t]) {h[t]=false;n=-1;} //false 表示没有
else {h[t]=true;n=1;}
while(x<=num)
{
tree[x]+=n;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=0;
while(x>0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
void dfs(int x)
{
v[x]=true;
b[x]=++num;
for(int i=head[x];i!=-1;i=a[i].next)
{
if(!v[a[i].x])
dfs(a[i].x);
}
e[x]=num;
//printf("%d %d %d\n",x,num,b[x]);
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
int m=0;
memset(tree,0,sizeof(tree));
memset(head,-1,sizeof(head));
for(i=1;i<n;i++)
{
int s,u;
scanf("%d%d",&s,&u);
m++;
a[m].x=u;a[m].next=head[s];head[s]=m;
m++;
a[m].x=s;a[m].next=head[u];head[u]=m;
}
memset(v,false,sizeof(v));
memset(b,0,sizeof(b));
memset(e,0,sizeof(e));
num=0;
dfs(1);
for(i=1;i<=n;i++)
{
update(b[i],i);
h[i]=true;
}
char str[10];
int t,mm;
scanf("%d",&mm);
for(i=1;i<=mm;i++)
{
scanf("%s%d",str,&t);
if(str[0]=='C')
update(b[t],t);
else
printf("%d\n",getsum(e[t])-getsum(b[t]-1));
}
}
return 0;
}

poj 3321的更多相关文章

  1. poj 3321 Apple Trie

    /* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 ...

  2. POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25904   Accepted: 7682 Descr ...

  3. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  4. POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)

    id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...

  5. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

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

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

  7. poj 3321 Apple Tree(一维树状数组)

    题目:http://poj.org/problem?id=3321 题意: 苹果树上n个分叉,Q是询问,C是改变状态.... 开始的处理比较难,参考了一下大神的思路,构图成邻接表 并 用DFS编号 白 ...

  8. POJ 3321 Apple Tree dfs+二叉索引树

    题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...

  9. Hdu 3887 Counting Offspring \ Poj 3321 Apple Tree \BZOJ 1103 [POI2007]大都市meg

    这几个题练习DFS序的一些应用. 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1.C x y     以节点x的权值修改为y. 2.Q x ...

  10. POJ 3321 Apple Tree 【树状数组+建树】

    题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...

随机推荐

  1. bzoj1148

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1148 很常见的排序贪心题...... 假设我们得到了一个最优序列,记s[n]=w[1]+w[2 ...

  2. Dynamic Binding & Static Binding

    Reference: JavaPoint BeginnerBook What is Binding Connecting a method call to the method body is kno ...

  3. 关于bootstrap--排版(标题、强调、背景、插入符等)

    1. 2.标题:<h1>这是主标题<small>这是副标题,为当前字号65%,灰色(#999)</small></h1>. 3.段落:<p> ...

  4. Laravel-高级篇-Artisan

    (慕课网_轻松学会Laravel-高级篇_天秤vs永恒老师_http://www.imooc.com/learn/702) 一.概述 Artisan是Laravel中自带的命令行工具的名称 由强大的S ...

  5. Mybatis分页插件PageHelper正确的用法(网上有2篇不够科学的文章)

    今天下午在Mybatis项目中.实现分页.由于我是后加入项目中的,Leader用的是PageHelper这个组件.可是我在实际使用的过程中遇到了2个大问题. 1.p=2#comments" ...

  6. [RxJS] Basic DOM Rendering with Subscribe

    While frameworks like Angular 2 and CycleJS provides great ways to update the DOM and handle subscri ...

  7. c++11 : range-based for loop

    0. 形式 for ( declaration : expression ) statement 0.1 根据标准将会扩展成这样的形式: 1   { 2     auto&& __ra ...

  8. Fedora安装VirtualBox时出现错误Kernel driver not installed (rc=-1908)的解决办法

    新建虚拟机后启动时出现如下错误: Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver (vboxdrv) ...

  9. python - 类的方法

    类的方法分为:普通方法. 静态方法和类方法   调用方式 特征 普通方法 由对象去调用执行,属于类 至少一个self,对象调用 静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封 ...

  10. CodeSmith使用总结--读取一个表试试

    我感觉CodeSmith对于我的最大用途是不用我手动创建每个表的Model.BLL和DAL了,那些繁琐的工作真的让我很无语. CodeSmith要读取数据库中的表就要先连接数据库. 新建一个数据库连接 ...