1103: [POI2007]大都市meg

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1544  Solved: 776

[Submit][Status][Discuss]

Description

在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也開始骑着摩托车传递邮件了。只是。她常常回顾起曾经在乡间漫步的情景。昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路。从每一个村庄都恰好有一条路径到达村庄1(即比特堡)。而且,对于每一个村庄。它到比特堡的路径恰好仅仅经过编号比它的编号小的村庄。另外。对于全部道路而言,它们都不在除村庄以外的其它地点相遇。在这个未开化的地方,从来没有过高架桥和地下铁道。随着时间的推移。越来越多的土路被改造成了公路。至今,Blue
Mary还清晰地记得最后一条土路被改造为公路的情景。如今,这里已经没有土路了——全部的路都成为了公路,而昔日的村庄已经变成了一个大都市。 Blue Mary想起了在改造期间她送信的经历。

她从比特堡出发。须要去某个村庄,而且在两次送信经历的间隔期间,有某些土路被改造成了公路.如今Blue Mary须要你的帮助:计算出每次送信她须要走过的土路数目。

(对于公路,她能够骑摩托车;而对于土路,她就仅仅好推车了。

Input

第一行是一个数n(1 < = n < = 2 50000). 

下面n-1行,每行两个整数a,b(1 < =  a下面一行包括一个整数m(1 < = m < = 2 50000),表示Blue Mary以前在改造期间送过m次信。 

下面n+m-1行,每行有两种格式的若干信息,表示按时间先后发生过的n+m-1次事件: 

若这行为 A a b(a若这行为 W a, 则表示Blue Mary以前从比特堡送信到村庄a。

Output

有m行,每行包括一个整数,表示相应的某次送信时经过的土路数目。

Sample Input

5

1 2

1 3

1 4

4 5

4

W 5

A 1 4

W 5

A 4 5

W 5

W 2

A 1 2

A 1 3


Sample Output

2

1

0

1

HINT

Source

题目是谁翻译的。你站出来。敢不敢再通顺点!

好吧。这道题是道裸DFS序+树状数组题。

DFS序记录每一个点进入和退出的时间。分别为l[i]和r[i],l[i]和r[i]的权值分别为1和-1。这样就能够在树状数组上计算了。每次询问仅仅要输出l[x]之前的前缀和,由于多余部分能够正负相消。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair<int,int>
#define maxn 250005
#define inf 1000000000
using namespace std;
int n,m,x,y,cnt=0,tot=0,top=0;
int st[maxn],fa[maxn],head[maxn],l[maxn],r[maxn],f[maxn*2];
char ch;
struct edge_type
{
int next,to;
}e[maxn*2];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void add_edge(int x,int y)
{
e[++tot]=(edge_type){head[x],y};head[x]=tot;
e[++tot]=(edge_type){head[y],x};head[y]=tot;
}
inline void dfs()
{
st[++top]=1;
while(top)
{
int now=st[top],f=fa[top--];
if (!l[now])
{
l[now]=++cnt;
st[++top]=now;
for(int i=head[now];i;i=e[i].next)
{
if (e[i].to==f) continue;
st[++top]=e[i].to;
fa[top]=now;
}
}
else r[now]=++cnt;
}
}
inline void add(int x,int y)
{
for(int i=x;i<=n*2;i+=(i&(-i))) f[i]+=y;
}
inline int query(int x)
{
int ans=0;
for(int i=x;i;i-=(i&(-i))) ans+=f[i];
return ans;
}
int main()
{
n=read();
F(i,1,n-1){x=read();y=read();add_edge(x,y);}
dfs();
F(i,2,n){add(l[i],1);add(r[i],-1);}
m=read();
F(i,1,n+m-1)
{
ch=getchar();while (ch<'A'||ch>'Z') ch=getchar();
x=read();
if (ch=='W') printf("%d\n",query(l[x]));
else
{
y=read();
add(l[y],-1);add(r[y],1);
}
}
}

bzoj1103【POI2007】大都市meg的更多相关文章

  1. [bzoj1103][POI2007]大都市meg(树状数组+dfs序)

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2031  Solved: 1069[Submit][Sta ...

  2. BZOJ1103 [POI2007]大都市meg 【树剖】

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3038  Solved: 1593 [Submit][S ...

  3. bzoj1103: [POI2007]大都市meg(树链剖分)

    1103: [POI2007]大都市meg 题目:传送门 简要题意: 给你一棵树,给出每条边的权值,两个操作:1.询问根到编号x的最短路径的权值和  2.修改一条边的边权 题解: 很明显啊,看懂了题基 ...

  4. bzoj1103: [POI2007]大都市meg

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1103 题目大意:在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Ma ...

  5. BZOJ1103 [POI2007]大都市meg dfs序 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...

  6. [BZOJ1103][POI2007]大都市meg dfs序+树状数组

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  7. BZOJ1103[POI2007]大都市meg 题解

    题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...

  8. BZOJ1103 [POI2007]大都市meg(DFS序)

    题目:一颗树,单边修改,链上查询..实际上链是根到结点的链.网上好像有其他做法,我的想法是这样的: 先不看修改,毫无疑问查询只是查询结点的深度:而修改一条边会有什么影响:影响是且只是以边上深度最深结点 ...

  9. 【dfs序】【树状数组】bzoj1103 [POI2007]大都市meg

    预处理出每个点到根节点的土路数,插到一个树状数组里,然后每次修改只会对子树中的节点造成影响,于是相当于区间修改.点查询了. #include<cstdio> using namespace ...

  10. 树状数组【bzoj1103】: [POI2007]大都市meg

    1103: [POI2007]大都市meg 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡 ...

随机推荐

  1. Spark弹性分布式数据集RDD

    RDD(Resilient Distributed Dataset)是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现.RDD是Spark最核心 ...

  2. sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)

    sql的行转列(PIVOT)与列转行(UNPIVOT)   在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...

  3. 全面拥抱移动测试,Mobile JSON Wire Protocol Specification文档翻译

    Selenium3已经宣布不支持移动化测试.对于老牌测试工具selenium来说这是以退为进,因为移动自动化测试工具的标准还在selenium团队手上. 本文轻度翻译了这个标准,看得懂的人不用翻译也能 ...

  4. CSS3选择器之学习笔记

    首先说first-child与last-child,这两个选择器很容易明白,就是父元素下的第一个子元素和最后一个子元素.而nth-child和nth-last-child则是父元素下指定序号的子元素, ...

  5. python中数组与多维数组用法介绍

    增加时a.append( 'a ')就可以了.只要按顺序加,就没有问题 . 使用时,完全可以使用下标: 代码如下 复制代码 a[0] a[1] 但出果引用不存在的下标,则会引发异常.这时,你需要先添加 ...

  6. Java String首字母大写

    一種寫法參考 public String upperFirstChar(String input) { if (input == null || "".equals(input)) ...

  7. systemd的程序自启动脚本编写

    以FreeSWITCH的自启动脚本为例. 一. 编写freeswitch.service文件 [Unit] Description=FreeSWITCH After=syslog.target net ...

  8. 【转载】mysql 热备份

    原文: http://www.jb51.net/article/70967.htm 热备和冷备是两个相对的概念,冷备是把数据库服务,比如MySQL,Oracle停下来,然后使用拷贝.打包或者压缩命令对 ...

  9. PHP实现无符号右移(js中的 >>>)

    移位包括有符号左移(<<).有符号右移(>>).无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符 ...

  10. ReactNative WebView组件详解

    在开发Android的时候,一般我们会有一些加载网页的需求,或者执行一些JavaScript,我们都知道在Android中实现这个功能的控件是WebView,在ReactNative中也有实现此类需求 ...