树状数组 - BZOJ 1103 [POI2007]大都市
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]大都市的更多相关文章
- 数据结构(线段树):BZOJ 1103 [POI2007]大都市meg
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1791 Solved: 925[Submit][Stat ...
- 【dfs序】【树状数组】bzoj1103 [POI2007]大都市meg
预处理出每个点到根节点的土路数,插到一个树状数组里,然后每次修改只会对子树中的节点造成影响,于是相当于区间修改.点查询了. #include<cstdio> using namespace ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- BZOJ 1103 [POI2007]大都市meg(树状数组+dfs序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, ...
- BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)
本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...
- bzoj 1103: [POI2007]大都市meg【dfs序+树状数组】
很明显的暗示,就是在树的dfs序上维护树状数组,加减的时候差分即可 #include<iostream> #include<cstdio> #include<cstrin ...
- BZOJ 1103: [POI2007]大都市meg( 树链剖分 )
早上数学考挂了...欲哭无泪啊下午去写半个小时政治然后就又可以来刷题了.. 树链剖分 , 为什么跑得这么慢... ------------------------------------------- ...
- BZOJ 1103: [POI2007]大都市meg
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2189 Solved: 1160[Submit][Sta ...
- 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 ...
随机推荐
- Centos安装iptables防火墙
一.安装说明: 1.因为centos7.0及以上版本就默认安装了firewall防火墙,但有时候根据项目实际所需,服务器上还是需要安装iptables,以下就是具体的安装步骤: 2.因阿里云在服务器外 ...
- Yii2.0 两次奇葩的数据库连接经历
经历一: 公司的项目经过阿里云的ECS升级后,发现在Yii2.0框架中,凡是数据库新增的字段(当然相关的表模型肯定是加了相应字段的),老是报“属性找不到”的问题,最后排查是数据库连接的问题.把127. ...
- SQL Server 2012安装配置(Part1 )
1 安装前准备 安装 SQL Server 2012 服务器及客户端前,需要提前做以下两项准备: SQL Server2012 依赖于.Net Framework 3.5.1 组件.Windows S ...
- Windows系统下查看文件编码类型
这是一个程序员的最基本的技能,原谅我到现在才去了解 以前只知道window操作系统下文件大部分默认编码是ANSI,中文版是GBK编码 如果想要查看或者修改文件编码的话有两种方式 一:用记事本打开文件, ...
- javase基础-Helloword
public class HelloWorld {//创建一个类 :1.类名首字母需要大写:2.类名必须和文件名一致 public static void main(String[] ...
- 记一次RabbitMq 安装和配置坑
记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...
- Spoj REPEATS 后缀自动机+set
REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...
- 在SAP C4C里触发SAP ERP的ATP check和Credit check
在C4C里创建一个新的Sales Quote: 添加三个行项目: 执行action "Request External Pricing"会从ERP更新pricing信息,触发ATP ...
- jsp页面之间传值 以及如何取出url的参数
写项目时往往要写多个页面,而多个jsp之间传值有时是必要的,这时可以用到如下方法: 而在另一个页面取值可以用:${param.xxx} 此处的xxx就是要传递的值
- eubacteria|endosymbiosis|基因转移
5.11线粒体和叶绿体是通过内共生进化而来的 初始细胞俘获有功能的真细菌(eubacteria)进入细胞内,该细菌逐渐演化为细胞器,这种现象称为内共生(endosymbiosis),所以该细胞器携带细 ...