BZOJ 1103 [POI 2007] dfs序+树状数组 解题报告
来源:互联网 发布:淘宝有种苗吗 编辑:程序博客网 时间:2024/06/05 07:05
1103: [POI2007]大都市meg
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
【解题报告】
一句话题意:有一棵所有边的权都是1的树、然后经过若干次操作把所有边的权值都变成0、中间会让你求根到一个点的权值和。
这题实际上就是求一个链上的数字和,比如我们现在考虑根,就是相当于把根的所有子孙权值和剪掉这个儿子之外的所有儿子的子孙权值和。
也就是说、每个点的权值只在它和它的子孙上有效。
于是想到了DFS序,利用差分的思想,每当访问到一个点就在对应时间戳的位置+1,离开的时候在对应时间戳-1
代码如下:
/************************************************************** Problem: 1103 User: onepointo Language: C++ Result: Accepted Time:5072 ms Memory:15228 kb****************************************************************/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 250010#define lowbit(x) (x&(-x))int n,m,cnt;int t[N<<1],head[N<<1];int pre[N],st[N],ed[N],idc;struct Edge{ int to,nxt;}e[N<<1];void adde(int u,int v){ e[++cnt].to=v; e[cnt].nxt=head[u]; head[u]=cnt;}void update(int x,int val){ for(int i=x;i<=(n<<1);i+=lowbit(i)) t[i]+=val;}int sum(int x){ int ret=-1; for(int i=x;i;i-=lowbit(i)) ret+=t[i]; return ret;}void dfs(int x) { st[x]=++idc; update(idc, 1); for(int i=head[x];~i;i=e[i].nxt) if(e[i].to^pre[x]) { pre[e[i].to]=x; dfs(e[i].to); } ed[x]=++idc; update(idc, -1); } int main(){ cnt=0; memset(head,-1,sizeof(head)); scanf("%d",&n); for(int i=1;i<n;++i) { int u,v;scanf("%d%d",&u,&v); if(u>v) swap(u,v); adde(u,v); } dfs(1); for(scanf("%d",&m);m;) { int a,b;char opt[5]; scanf("%s",opt); if(opt[0]=='W') { --m; scanf("%d",&a); printf("%d\n",sum(st[a])); } if(opt[0]=='A') { scanf("%d%d",&a,&b); if(a>b) swap(a,b); update(st[b],-1); update(ed[b],1); } } return 0;}
- BZOJ 1103 [POI 2007] dfs序+树状数组 解题报告
- [BZOJ 1103][POI 2007]大都市(DFS求拓扑序+树状数组)
- BZOJ 1264 树状数组+DP 解题报告
- BZOJ 1227 DP+树状数组 解题报告
- BZOJ 2124 树状数组+Hash 解题报告
- bzoj 1103(DFS序+树状数组)
- BZOJ 1103 POI 2007 大都市meg 树状数组
- BZOJ 3211&3038 并查集+树状数组 解题报告
- BZOJ 3688 树状数组优化DP 解题报告
- [dfs序 树状数组] BZOJ 1103 [POI2007]大都市meg
- 【bzoj 1103】[POI2007]大都市meg 树状数组维护dfs序
- BZOJ 1103: [POI2007]大都市meg 树链剖分, 树状数组+DFS序
- [bzoj 1103] 大都市meg(树状数组和dfs序)
- [BZOJ]1103: [POI2007]大都市meg dfs序+树状数组
- bzoj 2819: Nim 树状数组+dfs序
- BZOJ 1097 [POI 2007] SPFA+状压DP 解题报告
- BZOJ 2079 [Poi 2010] 图论 解题报告
- BZOJ 1131 [POI 2008] 解题报告
- HDU4734 F(x) 数位dp
- 多选框批量删除后台代码
- 前端与PHP后台的选择
- 04_Shell排序
- Hbase错误及处理
- BZOJ 1103 [POI 2007] dfs序+树状数组 解题报告
- AutoCompleteTextView的简单使用
- VsCode 插件整理之C#
- Hbase 部署中的几个问题解决.
- ZOJ-2317 Nice Patterns Strike Back
- 快速入门shell脚本编写(二)
- Enhanced Deep Residual Networks for Single Image Super-Resolution
- 详解Android studio的构建文件build.gradle
- 面试常考数据结构与算法