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. Null值操作

      1)NULL值写入的操作    create table j010(     id number(7),     name varchar2(20),     salary number(7,2) ...

  2. JDBC、事务和连接池

    一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...

  3. 2015 Multi-University Training Contest 3 hdu 5325 Crazy Bobo

    Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total ...

  4. BestCoder Round #52 (div.2) HDU 5418 Victor and World (DP+状态压缩)

    [题目链接]:pid=5418">click here~~ [题目大意]: 问题描写叙述 经过多年的努力,Victor最终考到了飞行驾照. 为了庆祝这件事,他决定给自己买一架飞机然后环 ...

  5. HDOJ find the safest road 1596【最短路变形】

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. Oracle 实现 mysql 更新 update limit

    oracle给人的感觉非常落后.使用非常不方便,Toad 这个软件又笨又迟钝.pl/sql更是,90年代的界面风格,速度还卡得要死.并且oracle不支持limit .by default7#zbph ...

  7. html页面的简单对话框(alert, confirm, prompt)

    html页面简单的三种对话框例如以下: 1.alert(),最简单的提示框: alert("你好!"); 2.confirm(),有确认和取消两个button: if(confir ...

  8. Oracle RAC集群体系结构

    一. Oracle集群体系结构 Oracle RAC,全称是Oracle Real Application Cluster,即真正的应用集群,是oracle提供的一个并行集群系统,整个集群系统由Ora ...

  9. Win7 如何禁用“切换用户”功能

    1.按win+r,输入gpedit.msc,点击确定: 2.依次点击计算机配置--管理模块--系统--登录,右侧列表中找到“隐藏“快速用户切换”的入口点”: 3.双击隐藏“快速用户切换”的入口点,点击 ...

  10. sql 跟踪

    目录 1 sql跟踪 1.1 alter session 1.2 DBMS_MONITOR 1.3 DBMS_SESSION 1.4 oradebug模式 1.5 触发器的模式启用sql 跟踪 1.6 ...