第三部分主要讲的是倍增思想及其应用。
在Day3的整理中,我简要提到了倍增思想,我们来回顾一下。
倍增是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想,它在变化规则相同的情况下,加速状态转移。
运用倍增方法预处理信息,可以加速询问。
如果题目的数据范围极大,线性时间也不够用,那就可以考虑倍增思想了。
 
1.快速幂
计算 a^x % p。
暴力是显然的,TLE。
其实就是想办法把x拆开。考虑先把它表示成二进制形式,我们可以用不超过logx个f[i]拼出我们想要的答案。
在x的二进制表示中,1表示“取”。二进制中的每一个1都表示2的i次方。
比如说计算a^100,100的二进制是01100100,可以看出在2^2,2^5,2^6位置是1,而这些数分别对应4,32,64,那么只需要把a^100拆分成a^64*a^32*a^4即可。
实现很容易,每次提取处最低的二进制位再除以2即可。
long long int fast_pow(long long int a,long long int x,long long int p){
long long int ans = ;
long long int sum = a % p;
for (;x;x>>=,sum = sum*sum%p)
if (x&)
ans = ans*sum%p;
return ans;
}
 
2.树上祖先
给定一棵N个节点的树,告诉你每个节点的父亲是谁,做Q次询问,每次询问某个点的k倍祖先是谁。
暴力做法显然,O(QN)。
有一种优化是预处理出每个点向后跳1~B步的点是哪个,每次询问B步B步地跳,当B = √N时,复杂度取得最优O(N√N)。
改进一下这个优化,预处理出每个点向父亲跳2^i步是谁,这样每次至多跳logN步就能跳到目标位置。
假设跳k步,考虑k的二进制表示,二进制中的每一个1都表示2^i,拼凑k。
每跳一步相当于删去一个1.
我们设f[i][j]为第i个元素向父亲跳2^j步是谁,则边界是f[i][0]为第i个元素的父亲。
转移:f[i][j] = f[f[i][j]-1][j-1]
for (int i=;i<=N;i++)
  for (int j=;i+(<<i)-<=N,i++)
    f[i][j] = f[f[i][j]-][j-];
查询:

int q(int x,int k){
  for (int i=N;i>=;i--)
    if (k & ( << i))
      x = f[x][i];
  return x;
}
3.倍增LCA
参阅Day3整理
 
4.ST表
用来维护区间信息。对于重复信息只会贡献一次的信息,我们可以用ST表来实现高效查询。
还是倍增思想,预处理每个位置向后2^i长度的信息,假设我们要查询的是[L,R],可以通过两段长度为2^k长度的区间覆盖[L,R],k = floor(log(R-L+1))
以区间最小值举例,预处理时先枚举i再枚举j,f[i][j] = min(f[i-1][j],f[i-1][j+(1 << i-1)])
查询时,ans = min(f[k][l],f[k][r-(1 << k)+1])
ST表可以维护最大值,最小值,gcd等,但不能维护求和等信息,因为这样会重复计算。同时也不支持修改,所以是一个比较弱的数据结构。
不过,ST表可以完成树上LCA的查询。用它记录树的欧拉序,也就是说,在每次遍历到这个节点时都将其记录下来。
所谓欧拉序,就是记录你DFS一棵树的时候的遍历轨迹。
比如说这样一棵树:

 
它的欧拉序是ABDBACECFCA
可以知道,对于一个有N个节点的树,其欧拉序的长度为2N-1。
记x第一次出现的位置为fir[x],有一个结论:
对于两个节点u,v,欧拉序[fir[u],fir[v]]这段区间中的深度最浅的那个节点,是lca(u,v)。
因为u,v之间的路径上的节点都会出现在这段区间。深度比u,v的lca的小的节点不会出现在这段区间。维护欧拉序中的每个位置,向后2^i的区间中深度最浅的节点是谁。
查询方式和刚才上边那个例子类似,用那个做法查询[fir[u],fir[v]]这一段的最小值就好。
 
 
 
 
 

夏令营讲课内容整理 Day 6 Part 3.的更多相关文章

  1. 夏令营讲课内容整理 Day 7.

    Day7是夏令营的最后一天,这一天主要讲了骗分技巧和往年经典的一些NOIP试题以及比赛策略. 这天有个小插曲,上午的day7T3是一道和树有关的题,我是想破脑袋也想不出来,正解写不出来就写暴力吧,暴力 ...

  2. 夏令营讲课内容整理 Day 3.

    本日主要内容是树与图.   1.树 树的性质 树的遍历 树的LCA 树上前缀和   树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的.   回到题目上,如果题 ...

  3. 夏令营讲课内容整理Day 0.

    今年没有发纸质讲义是最气的.还好我留了点课件. 第一次用这个估计也不怎么会用,但尝试一下新事物总是好的. 前四天gty哥哥讲的内容和去年差不多,后三天zhn大佬讲的内容有点难,努力去理解吧. 毕竟知识 ...

  4. 夏令营讲课内容整理 Day 6 Part 2.

    Day 6的第二部分,数论 数论是纯粹数学的分支之一,主要研究整数的性质   1.一些符号: a mod b 代表a除以b得到的余数 a|b a是b的约数 floor(x) 代表x的下取整,即小于等于 ...

  5. 夏令营讲课内容整理 Day 6 Part 1.

    Day6讲了三个大部分的内容. 1.STL 2.初等数论 3.倍增   Part1主要与STL有关. 1.概述 STL的英文全名叫Standard Template Library,翻译成中文就叫标准 ...

  6. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  7. 夏令营讲课内容整理 Day 4.

    本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...

  8. 夏令营讲课内容整理 Day 2.

    本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...

  9. 夏令营讲课内容整理Day 1.

    主要内容是栈和队列. 1.  栈 运算受到限制的线性表.只允许从一端进行插入和删除等操作.这一端便是栈顶,另一端便是栈底. 其实可以把栈想象层任何有底无盖的柱状的容器...毕竟栈满足后进先出的特性.计 ...

随机推荐

  1. HDU--2021

    发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. python数据类型(二)

    一.List(列表) List(列表) 是 Python 中使用最频繁的数据类型. 列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套). ...

  3. callback和spring的MD5加密

    举个例子:当我们访问淘宝网站的时候,当点击购物车的时候,这个时候提示用户登录用户名和密码,登录成功后,会返回到购物车的页面.这就是回调. 它不返回淘宝的首页,而是返回到我们点击的内容所在页面. 在写接 ...

  4. [国嵌笔记][027][ARM协处理器访问指令]

    协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP1 ...

  5. Oracle:对用户的CREATE、ALTER、GRANT、REVOKE操作练习

    --创建一个用户yong2,yong2的表空间为users,临时表空间为temp,users的表空间大小为10M,密码立刻过期,用户锁定. CREATE USER yong2IDENTIFIED BY ...

  6. php 使用 ffmpeg 转换视频,截图,并生成缩略图

    http://blog.csdn.net/toss156/article/details/7003059 把ffmpeg 和  生成缩略图整合了一下. include("ImageResiz ...

  7. Win7如何解决telnet不是内部或外部命令的方案!听语音

    Telnet用于远程操作互联网中的设备或终端计算机服务器,可以有效的减少现场操作的麻烦.因为设备或终端是遍布整个省或市,有的甚至是国外,如何高效的处理问题是当务之急,除了telnet还可以ssh使用c ...

  8. MySQL事务隔离级别的实现原理

    回顾 在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可 ...

  9. Spring学习之路二——概念上理解Spring

    一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...

  10. oracle02

    SQL语句完整结构: select from where group by having order by 今天分享的知识点:(1)分组查询 select 中非组函数的列需要在group by 进行参 ...