树状数组 - 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 ...
随机推荐
- 记一次NegativeArraySizeException
问题描述:服务器接收后台返回的报文时,提示java.lang.NegativeArraySizeException 分析:这种异常返回的原因,一般情况下没有报文提示为返回空报文,初步分析是响应报文流长 ...
- Linux:linux下建ftp用户,并限制用户访问路径
安装:ftp安装部分,操作步骤如下: 可以使用yum命令直接安装ftp # yum install vsftpd ftp服务的开启与关闭命令: 开启:# service vsftpd start 关闭 ...
- CentOS7.2上安装Python3.6
CentOS 7下安装Python3.6 1)安装python3.6可能使用的依赖yum -y install openssl-devel bzip2-devel expat-devel gdbm-d ...
- AutoIt上传非input控件方式的文件脚本
AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...
- Python socket 粘包
目录 1 TCP的三次握手四次挥手 0 1.1 三次握手 1 1.2 四次挥手 2 2 粘包现象 3 2.1 基于TCP制作远程执行命令操作(win服务端) 4 2.1 基于TCP制作远程执行命令操作 ...
- c++作业:求N的阶乘。
N的阶乘就是n.(n-1)! 5的阶乘是什么?5*4*3*2*1 #include <iostream> using namespace std; int jiecheng(int num ...
- iOS开发之WIFI,3G/4G两种网络同时使用技巧
最近遇到一个比较奇葩的需求:App与硬件通过WiFi LAN通信, 同时App需要与服务器通过3G/4G WAN通信,如下图: 众所周知,手机同时打开WiFi和3G时候,会优先走WiFi.这个该如何实 ...
- Objective-C实现一个简单的栈
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...
- Codeforces 517 #A
http://codeforces.com/contest/1072/problem/A 题目挺简单,就是让你求几个环,占得方格的个数,然而题目为什么给出了公式呢? 然而给出的公式辣么丑,还是不用的好 ...
- pythonnet-网络编程(1)
python的网络编程有不少难点,也容易忘记,最近我会陆续发出系统.完整pythonnet知识的博客,一边复习一边分享,感兴趣的可以关注我. 话不多说,开始吧. 网络编程 目的:数据的传输 ISO(国 ...