BZOJ1103 大都市

问题描述

在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了。
不过,她经常回忆起以前在乡间漫步的情景。昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路。从每个村庄都恰好有一条路径到达村庄1(即比特堡)。并且,对于每个村庄,它到比特堡的路径恰好只经过编号比它的编号小的村庄。

另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇。在这个未开化的地方,从来没有过高架桥和地下铁道。随着时间的推移,越来越多的土路被改造成了公路。至今,Blue Mary还清晰地记得最后一条土路被改造为公路的情景。现在,这里已经没有土路了——所有的路都成为了公路,而昔日的村庄已经变成了一个大都市。
Blue Mary想起了在改造期间她送信的经历。她从比特堡出发,需要去某个村庄,并且在两次送信经历的间隔期间,有某些土路被改造成了公路.
现在Blue Mary需要你的帮助:计算出每次送信她需要走过的土路数目。(对于公路,她可以骑摩托车;而对于土路,她就只好推车了。)

输入格式

 第一行是一个数n(1 < = n < = 2 50000).
以下n-1行,每行两个整数a,b(1 < =a < b <=n) 以下一行包含一个整数m(1 < = m < = 2 50000),表示Blue Mary曾经在改造期间送过m次信。
以下n+m-1行,每行有两种格式的若干信息,表示按时间先后发生过的n+m-1次事件:若这行为 A a b,表示道路a b被改成了公路。若这行为 W a, 则表示Blue Mary曾经从比特堡送信到村庄a。

输出格式

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

样例输入

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

样例输出

2
1
0
1


树链剖分当然是可以搞的。但是这样会比较卡。

考虑把一条边改成公路的影响,设这条边连接的较深的节点为 x x,那么xx的子树到根节点的答案都会减去1。这让我们想起了DFS序的性质: x x及其子树表示的区间是[In[x],Out[x]][In[x],Out[x]],而且一定是连续的一段。那么这个操作就可以转换为对一个连续区间减去了1。另一个操作就是查询某个节点的值。

实现区间修改的操作,常常采用两种方式:

1.线段树
2.差分数组

差分数组本来是修改 O(1) O(1),查询 O(n) O(n)的时间复杂度,暴力求前缀和太慢了。本题查询次数可能会很多,这样一定会TLE。因此,采用树状数组维护差分数组的方式,虽然修改的时间复杂度增大为了 O(logn) O(logn),但是查询被大大优化为 O(logn) O(logn),这样就可以过这道题了。

有了树状数组当然就不选线段树了。


#include<stdio.h>
#define MAXN 250005
#define MAXM 500005int N,M;int en[MAXM],nex[MAXM],las[MAXN],tot;
void ADD(int x,int y)
{en[++tot]=y;nex[tot]=las[x];las[x]=tot;
}int In[MAXN],Out[MAXN],dep[MAXN],VT;
void DFS(int x,int f)
{int i,y;In[x]=++VT;dep[x]=dep[f]+1;for(i=las[x];i;i=nex[i]){y=en[i];if(y!=f)DFS(y,x);}Out[x]=VT;
}int C[MAXN];void Modify(int x,int k){for(int i=x;i<=N;i+=(i&-i))C[i]+=k;}int GetSum(int x)
{int i,sum=0;for(i=x;i;i-=(i&-i))sum+=C[i];return sum;
}int mian()
{int i,x,y,a,b;char op[3];scanf("%d",&N);for(i=1;i<N;i++){scanf("%d%d",&x,&y);ADD(x,y);ADD(y,x);}DFS(1,0);for(i=2;i<=N;i++)Modify(In[i],1),Modify(Out[i]+1,-1);scanf("%d",&M);for(i=1;i<=N+M-1;i++){scanf("%s",op);if(op[0]=='W'){scanf("%d",&x);printf("%d\n",GetSum(In[x]));}else{scanf("%d%d",&x,&y);if(In[x]<In[y])a=In[y],b=Out[y];else a=In[x],b=Out[x];Modify(a,-1);Modify(b+1,1);}}
}
const int main_stack=16;
char my_stack[128<<20];
int main() {__asm__("movl %%esp, (%%eax);\n"::"a"(my_stack):"memory");__asm__("movl %%eax, %%esp;\n"::"a"(my_stack+sizeof(my_stack)-main_stack):"%esp");mian();__asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");return 0;
}

BZOJ1103 大都市 DFS序 树状数组维护差分数组相关推荐

  1. 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和

    前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...

  2. 计蒜客(青出于蓝胜于蓝) dfs序+树状数组

    武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名 第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师 ...

  3. HDU - 5788 Level Up(主席树+dfs序+树状数组)

    题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...

  4. 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)

    题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...

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

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

  6. CF-547E(Mike and Friends)后缀数组+线段树 AC自动机+DFS序+树状数组

    题目链接 题意 NNN个串,每次询问区间[L,R][L,R][L,R]中有多少子串SiS_iSi​ 思路 把NNN个串合成一个长字符串,对这个长字符串求后缀数组,包含SiS_iSi​的子串的heigh ...

  7. HDU - 5877 Weak Pair (dfs序+树状数组+离散化)

    VJ地址 题意:给一个有根树给你,计算一下满足下列条件的序列对的数目 (1)u是v的祖先(不能是它自己) (2)a[v]*a[u]<=k 思路:用DFS序分裂每一条链,使链上的点都是当前加入点的 ...

  8. 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组

    武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...

  9. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3521  Solved: 1913 [Submit][S ...

最新文章

  1. jquery ajax(实现单独提交某个form)
  2. tcp/ip 协议栈Linux内核源码分析七 路由子系统分析二 策略路由
  3. Resolving Problems installing the Java JCE Unlimited Strength Jurisdiction Policy Files package--转
  4. 裸辞,迎接2019年的春天
  5. windows和linux主机名,windows和linux下如何远程获取操作系统版本和主机名
  6. vba上传文件到ftp服务器指定目录下面
  7. c mysql 双主复制_mysql双主复制及使用keepalived作高可用的配置详解
  8. creportctrl 排序_witclient 智能客户端
  9. 小学教师计算机说课,浙江温州小学计算机教师资格认证说课稿
  10. [SimplePlayer] 6. 音频同步
  11. 最新白白iApp手册开源-iApp源码 非常牛逼
  12. 上海交通大学电子与通信工程819考研上岸经验分享
  13. CSS 自定义Radio样式
  14. DNA排序算法--代码
  15. 实现简单的许愿墙效果HTML
  16. Google Chrome 旧版本下载地址
  17. 【深度学习】学习案例:Keras 多层感知器手写数字识别
  18. XMOS学习笔记之xC语言
  19. FPGA学习之嵌入式硬件系统(SOPC)概述(软硬件设计)
  20. 1248. 统计「优美子数组」 前缀和

热门文章

  1. 三天入门MySQL---DAY 1---库和表的创建、删除、更新
  2. 橙仕X2双排mini卡已经开始接受订单
  3. zynq获取程序运行时间
  4. pHP 眼病,以下四种眼病会导致眼盲
  5. stm32 esp8266-01使用 get,post 请求数据以及json解析
  6. C语言实现植物大战僵尸----学习过程
  7. yum安装报错:ImportError: No module named urlgrabber.grabber
  8. len是python的内置函数吗_len(x) 击败 x.len(),从内置函数看 Python 的设计思想(内有公号宣传,不喜勿进)...
  9. 60分钟搞定JAVA加解密
  10. VMware虚拟机vmx文件丢失