bzoj 1103 [POI2007]大都市

描述

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

从每个村庄都恰好有一条路径到达村庄 1(即比特堡)。并且,对于每个村庄,它到比特堡的路径恰好只经过编号比它的编号小的村庄。另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇。在这个未开化的地方,从来没有过高架桥和地下铁道。

随着时间的推移,越来越多的土路被改造成了公路。至今,Blue Mary 还清晰地记得最后一条土路被改造为公路的情景。现在,这里已经没有土路了——所有的路都成为了公路,而昔日的村庄已经变成了一个大都市。

Blue Mary 想起了在改造期间她送信的经历。她从比特堡出发,需要去某个村庄,并且在两次送信经历的间隔期间,有某些土路被改造成了公路.现在 Blue Mary 需要你的帮助:计算出每次送信她需要走过的土路数目。(对于公路,她可以骑摩托车;而对于土路,她就只好推车了。)

输入

第一行是一个数 n.

以下 n-1 行,每行两个整数 a,b(1<=a<b<=n),表示改造开始之前有一条土路连接着村庄 a 和村庄 b.

以下一行包含一个整数 m,表示 Blue Mary 曾经在改造期间送过 m 次信。

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

若这行为 A a b(1<=a<b<=n),则表示城市 a,b 之间的土路被改成公路,保证不会重复;

若这行为 W a, 则表示 Blue Mary 曾经从比特堡送信到村庄 a。

输出

有 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
1
0
1

提示

1<= N , M <=100000


这又是什么鬼翻译

显然题目给出了一棵树,并在树上进行了查询和修改操作。

所以可以用树状数组解决。

X入栈时栈内的点是 1 到 X 的路径上的点。

以 1 为根进行 DFS,每个点(1 除外)入栈时向序列中加一个 1,出栈时加入一个-1。

对于修改,我们将较深点对应的权值变为0(即入栈时加-1,出栈时加1);

对于查询,设 X 入栈位置为 a,那么 1 到 X 的距离为树状数组前 a 个元素的和。

然而我考试时竟然把树状数组写炸了

代码蒯上

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int _a=0;bool _b=1;register char _c=getchar();
while(_c<'0' || _c>'9'){if(_c=='-')_b=0;_c=getchar();}
while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
return _b?_a:-_a;
}
const int _ = 100002;
struct edge{int to,ne;edge(){to=ne=0;}}e[_];
int he[_]={0},ecnt=0;
void add(int fr,int to){e[++ecnt].to=to,e[ecnt].ne=he[fr],he[fr]=ecnt;}
int t[_]={0},in[_]={0},out[_]={0},n,m,cnt=0;
#define lb(x) ((x)&(-(x)))
void undo(int d,int num){while(d<=n)t[d]+=num,d+=lb(d);}
int finder(int d){int sum=0;while(d)sum+=t[d],d-=lb(d);return sum;}
void DFS(int d)
{
out[d]=1,in[d]=++cnt;
for(int i=he[d];i;i=e[i].ne)DFS(e[i].to),out[d]+=out[e[i].to];
undo(in[d],1),undo(in[d]+out[d],-1);
}
int main()
{
register int i,a,b;char ch[6];
n=gotcha();
for(i=1;i<n;i++)a=gotcha(),b=gotcha(),add(min(a,b),max(a,b));
DFS(1),undo(1,-1),undo(n+1,1);
m=gotcha()+n-1;
while(m--)
{
scanf("%s",ch),a=gotcha();
if(ch[0]=='W')printf("%d\n",finder(in[a]));
else b=max(a,gotcha()),undo(in[b],-1),undo(in[b]+out[b],1);
}
return 0;
}

记住以后读字符指令都要用字符串读!否则每次都读入一些奇怪的东西

树状数组 - BZOJ 1103 [POI2007]大都市的更多相关文章

  1. 数据结构(线段树):BZOJ 1103 [POI2007]大都市meg

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1791  Solved: 925[Submit][Stat ...

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

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

  3. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

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

  4. BZOJ 1103 [POI2007]大都市meg(树状数组+dfs序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, ...

  5. BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)

    本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...

  6. bzoj 1103: [POI2007]大都市meg【dfs序+树状数组】

    很明显的暗示,就是在树的dfs序上维护树状数组,加减的时候差分即可 #include<iostream> #include<cstdio> #include<cstrin ...

  7. BZOJ 1103: [POI2007]大都市meg( 树链剖分 )

    早上数学考挂了...欲哭无泪啊下午去写半个小时政治然后就又可以来刷题了.. 树链剖分 , 为什么跑得这么慢... ------------------------------------------- ...

  8. BZOJ 1103: [POI2007]大都市meg

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

  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 ...

随机推荐

  1. Centos安装iptables防火墙

    一.安装说明: 1.因为centos7.0及以上版本就默认安装了firewall防火墙,但有时候根据项目实际所需,服务器上还是需要安装iptables,以下就是具体的安装步骤: 2.因阿里云在服务器外 ...

  2. Yii2.0 两次奇葩的数据库连接经历

    经历一: 公司的项目经过阿里云的ECS升级后,发现在Yii2.0框架中,凡是数据库新增的字段(当然相关的表模型肯定是加了相应字段的),老是报“属性找不到”的问题,最后排查是数据库连接的问题.把127. ...

  3. SQL Server 2012安装配置(Part1 )

    1 安装前准备 安装 SQL Server 2012 服务器及客户端前,需要提前做以下两项准备: SQL Server2012 依赖于.Net Framework 3.5.1 组件.Windows S ...

  4. Windows系统下查看文件编码类型

    这是一个程序员的最基本的技能,原谅我到现在才去了解 以前只知道window操作系统下文件大部分默认编码是ANSI,中文版是GBK编码 如果想要查看或者修改文件编码的话有两种方式 一:用记事本打开文件, ...

  5. javase基础-Helloword

    public class HelloWorld {//创建一个类 :1.类名首字母需要大写:2.类名必须和文件名一致         public static void main(String[]  ...

  6. 记一次RabbitMq 安装和配置坑

    记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...

  7. Spoj REPEATS 后缀自动机+set

    REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...

  8. 在SAP C4C里触发SAP ERP的ATP check和Credit check

    在C4C里创建一个新的Sales Quote: 添加三个行项目: 执行action "Request External Pricing"会从ERP更新pricing信息,触发ATP ...

  9. jsp页面之间传值 以及如何取出url的参数

    写项目时往往要写多个页面,而多个jsp之间传值有时是必要的,这时可以用到如下方法: 而在另一个页面取值可以用:${param.xxx}   此处的xxx就是要传递的值

  10. eubacteria|endosymbiosis|基因转移

    5.11线粒体和叶绿体是通过内共生进化而来的 初始细胞俘获有功能的真细菌(eubacteria)进入细胞内,该细菌逐渐演化为细胞器,这种现象称为内共生(endosymbiosis),所以该细胞器携带细 ...