poj 3321
题意:一开始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的更多相关文章
- poj 3321 Apple Trie
/* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 ...
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...
- 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 ...
- 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(一维树状数组)
题目:http://poj.org/problem?id=3321 题意: 苹果树上n个分叉,Q是询问,C是改变状态.... 开始的处理比较难,参考了一下大神的思路,构图成邻接表 并 用DFS编号 白 ...
- POJ 3321 Apple Tree dfs+二叉索引树
题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...
- 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 ...
- POJ 3321 Apple Tree 【树状数组+建树】
题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
随机推荐
- 华为u8800怎样root?
用SuperOneClick就可以root了 .在手机上面进入设置-应用程序-开发-三个都要勾选.用数据线连接到电脑,确认可正常连接.不行就使用豌豆夹连接,豌豆夹会自动帮你安装手机的驱动.运行Supe ...
- Hash Map (Hash Table)
Reference: Wiki PrincetonAlgorithm What is Hash Table Hash table (hash map) is a data structure use ...
- HTML5新增的一些属性和功能之一
大致可以分为10个方面: HTML5表单元素和属性 表单2.0 视音频处理 canvas绘图 SVG绘图 地理定位 拖放技术 web work web storage web socket 一.新的i ...
- 一个js编写全选、弹出对话框、ajax-json的案例
js功能有:全选.弹出对话框.使用json传输ajax数据:不想在写多余的文字了,直接上代码: <%@ page language="java" contentType=&q ...
- .net网站开发(一):1.input表单元素
其实,在半年前我对网站开发还是完全不感冒的,不是没认识,而是只认识到表面.我以为网站模型就那几样,新闻.论坛.博客啥的,仿个站出来有什么意思?但现在我是知道了,大多应用开发还是采用B/S架构的,包括服 ...
- fread(),fwrite() 读/写流
C 库函数 - fread() 描述 C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 strea ...
- oracle创建表空间-用户-角色-授权
1.创建数据表空间: SQL> create tablespace rusky_data datafile 'D:\rusky\rusky_data01,dbf' size 10M autoex ...
- post请求和get请求的区别
1:如果表单是以post方式发送,那么表单中的数据会放在请求报文体中,发送到服务端.但是如果是以get方式提交表单,那么表单中用户输入的数据都是以URL地址的方式发送到服务端. 2:在服务端接收数据时 ...
- WebApi2官网学习记录---JSON与XML的序列化
JSON序列化: WebAPI的默认序列库使用的是Json.NET,可以在Globally中配置使用DataContractJsonSerializer 进行序列化 protected void Ap ...
- 《第一行代码》学习笔记3-活动Activity(1)
1.活动-一种可以包含用户界面的组件,用于和用户进行交互. <Button android:id="@+id/button_1" android:layout_width=& ...