Apple Tree
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 21566   Accepted: 6548

Description

There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree.

The tree has N forks which are connected by branches. Kaka numbers the forks by 1 toN and the root is always numbered by 1. Apples will grow on the forks and two apple won't grow on the same fork. kaka wants to know how many apples are
there in a sub-tree, for his study of the produce ability of the apple tree.

The trouble is that a new apple may grow on an empty fork some time and kaka may pick an apple from the tree for his dessert. Can you help kaka?

Input

The first line contains an integer N (N ≤ 100,000) , which is the number of the forks in the tree.

The following N - 1 lines each contain two integers u and v, which means forku and fork
v are connected by a branch.

The next line contains an integer M (M ≤ 100,000).

The following M lines each contain a message which is either

"C x" which means the existence of the apple on fork
x
has been changed. i.e. if there is an apple on the fork, then Kaka pick it; otherwise a new apple has grown on the empty fork.

or

"Q x" which means an inquiry for the number of apples in the sub-tree above the forkx, including the apple (if exists) on the fork x

Note the tree is full of apples at the beginning

Output

For every inquiry, output the correspond answer per line.

Sample Input

3
1 2
1 3
3
Q 1
C 2
Q 1

Sample Output

3
2

Source

POJ Monthly--2007.08.05, Huang, Jinsong

题目大意给你一棵树,每一个节点開始的时候有一个苹果,下边m个操作,Q a,查询以a和a的子树的总共的苹果数,c b。改动操作,改变b节点,,開始在有变没有,没有变成有

ac代码

#include<stdio.h>
#include<string.h>
struct node
{
int u,v,next;
}edge[100010<<1];
int head[100010],cnt,num[100010],son[100010],cc,vis[100100];
void add(int u,int v)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int u)
{
num[u]=++cc;
//son[u]=1;
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
dfs(v);
// son[u]+=son[v];
}
son[u]=cc;
}
struct s
{
int sum,cover;
}node[100010<<2];
void pushdown(int tr,int m)
{
if(node[tr].cover)
{
node[tr<<1].cover=node[tr<<1|1].cover=1;
node[tr<<1].sum=m-(m>>1);
node[tr<<1|1].sum=(m>>1);
node[tr].cover=0;
}
}
void build(int l,int r,int tr)
{
node[tr].cover=1;
node[tr].sum=r-l+1;
if(l==r)
{
return;
}
int mid=(l+r)>>1;
build(l,mid,tr<<1);
build(mid+1,r,tr<<1|1);
}
void update(int pos,int l,int r,int tr)
{
if(l==pos&&r==pos)
{
if(node[tr].cover)
{
node[tr].cover=0;
node[tr].sum=0;
}
else
{
node[tr].cover=1;
node[tr].sum=1;
}
return;
}
pushdown(tr,r-l+1);
int mid=(l+r)>>1;
if(pos<=mid)
update(pos,l,mid,tr<<1);
else
update(pos,mid+1,r,tr<<1|1);
node[tr].sum=node[tr<<1].sum+node[tr<<1|1].sum;
if(node[tr<<1].cover&&node[tr<<1|1].cover)
{
node[tr].cover=1;
}
}
int query(int L,int R,int l,int r,int tr)
{
if(L<=l&&R>=r)
{
return node[tr].sum;
}
int mid=(l+r)>>1;
pushdown(tr,r-l+1);
int ans=0;
if(L<=mid)
ans+=query(L,R,l,mid,tr<<1);
if(R>mid)
ans+=query(L,R,mid+1,r,tr<<1|1);
return ans;
/*if(R<=mid)
return query(L,R,l,mid,tr<<1);
else
if(L>mid)
return query(L,R,mid+1,r,tr<<1|1);
else
return query(L,mid,l,mid,tr<<1)+query(mid+1,R,mid+1,r,tr<<1|1);*/
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
cnt=0;
cc=0;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
int i;
for(i=0;i<n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
dfs(1);
int m;
scanf("%d",&m);
build(1,n,1);
while(m--)
{
char s[2];
scanf("%s",s);
if(s[0]=='Q')
{
int a;
scanf("%d",&a);
int ans=query(num[a],son[a],1,n,1);
printf("%d\n",ans);
}
else
{
int a;
scanf("%d",&a);
update(num[a],1,n,1);
}
}
}
}

POJ 题目3321 Apple Tree(线段树)的更多相关文章

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

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

  2. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

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

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

  4. (简单) POJ 3321 Apple Tree,树链剖分+树状数组。

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

  5. poj 3321:Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

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

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

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

    点我看题目  题意 : 大概是说一颗树有n个分岔,然后给你n-1对关系,标明分岔u和分岔v是有边连着的,然后给你两个指令,让你在Q出现的时候按照要求输出. 思路 :典型的树状数组.但是因为没有弄好数组 ...

  8. POJ 3321 Apple Tree (DFS + 树状数组)

    题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...

  9. POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13805   Accepted: 5996 Descriptio ...

随机推荐

  1. array_combine php一个比较偏门的数组函数

    这函数  返回数组1的值 当做key,把数组2的值当做value,   当查询数据库用了 group +GROUP_CONCAT 两个组合时,(例如查询某个班级的,用户名,用户id,返回的是字符串,打 ...

  2. mybatis插入操作时,返回自增主键id

    mapper.xml 代码 <insert id="insert" parameterType="com.Student" > <select ...

  3. 什么是PL/SQL,有什么用

    1.什么是PL/SQL,有什么用  Procedure Language+SQL  PL/SQL是Oracle数据库特有的编程语言.  PL/SQL程序是以SQL为基础,引入了  编程语言特点,例如变 ...

  4. java源码之Comparable和Comparator

    1,Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实 ...

  5. Mysql如何避免全表扫描的方法

    在以下几种条件下,MySQL就会做全表扫描: 1>数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了.当表的记录总数小于10且记录长度比较短时通常这么做. 2>没有合适用于 ON ...

  6. Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型

    转自原文 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 播放mp4格式的时候提示 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 原因是在IIS中 ...

  7. 混合高斯模型的EM求解(Mixtures of Gaussians)及Python实现源代码

    今天为大家带来混合高斯模型的EM推导求解过程. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVhbnl1YW5zZW4=/font/5a6L5L2T/ ...

  8. mysql数据库连接工具类C3P0

    package com.dl.network_flow.db; import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  9. Linux下iscsi的使用

    查看是否已安装了iscsi-initiator:  [root@test\ ~]# rpm -qa |grep iscsi iscsi-initiator-utils-6.2.0.868-0.18.e ...

  10. node,koa 图片批量添加水印,可手动配置水印位置

    公司设计在处理京东上架商品图片的时候,需要给设计好的图片添加京东的“logo”,并且logo位置得根据图片来摆放,需要通过计算得出logo位置.那样太麻烦了,于是就用node,koa写了批量给图片添加 ...