内容提要

lca(最近公共祖先)

st表

hash

并查集

树状数组

线段树


数据结构

1.堆

Priority_queue

他滋兹:插入删除查询最大值(最小值)

分为大根堆小根堆

2.LCA

首先我们有一棵树,定义某个点的祖先为这个点到根节点的路径上的所有点

我们现在有两个点A,B,我们发现A和B有一些公共的祖先

我们只需要找到最近的公共祖先LCA,就可以找到它们所有的公共祖先

LCA一定是最深的公共祖先

步骤:

  1. 如果A的深度小于B的深度,就把它们互换(为了处理方便)
  2. 把A向上调到和B同样的深度,直到A和B同一个深度
  3. A和B一起上调,直到A和B相同

复杂度 O(deep),如果树是一条链就炸了

我们考虑优化

令P[x][i]表示x的第2^i的祖先是哪个节点

显然P[x][i]=p[[x][i-1]][i-1]

优化:把A向上调到和B同样的深度

我们发现A和B之间有深度差

比如d[A]-d[B]=19     对19进行二进制分解   10011

A->P[A][4]  16

A->P[A][1]   2

A->P[A][0]   1

优化:A和B一起上调

我们发现A和B的祖先一直都不相同,直到某个点之后一直相同

这个点不好确定,所以我们可以确定最后的祖先不相同的地方

也就是说,i从大往小循环,如果P[A][i]!=P[B][i],就把A和B同时向上跳2^i

LCA应用:常用来处理树上可差分的信息

比如我们要求点A到点B的路径长度,我们只需要求出LCA(A,B)就好了

ST表

定义mx[i][j]为i~i+2^j-1的最大值

如果我们要求[L,R]区间的最大值

比如[19,46]

先求L=46-19+1=28

求log2 L下取整

然后把区间分成两半求就可以了

则Ans=max(mx[19][4],mx[31][4])

HASH

HASH是一种函数,平常说的hash是把一个字符串变成一个数。F(字符串)=int

Map是基于比较函数的红黑树

如果你在map中放一个字符串,两个字符串的比较就是O(len(s))的,贼慢

所以我们需要开发一种新的东西

假如我们用a表示1,b表示0

ababb 就可以用类似于二进制的方式来算出它的值

Hash是允许冲突的,但是我们要尽可能避免冲突,而不是根治冲突

Jzm1926 p=83(p比字符串集大并且是个质数)

==’6’*p^0+’2’*p^1+....

但是由于有可能会很大,所以我们要%一个质数

如果为了方便,可以直接开unsigned long long 因为2^64-1恰好是一个质数(滑稽

这样自然溢出就省去了取模操作

为了避免冲突,我们可以考虑取两个模数

但是我们目前无法求子串的hash值

我们希望设计一种算法,至少能满足字符串拼接删除

现在有dingmingshuo这个字符串和一个p

d     d

di    d*p^1+i

din   d*p^2+i*p^1+n

ding  d*p^3+i*p^2+n*p^1+g

我们要求ing的hash就是ding的hash-d的hash乘p^3

ng的hash就是ding的hash-di的hash乘p^2

令h[i]表示1~i的hash值

h[i]=h[i-1]*p+s[i]

hash[i][j]=(h[j]-h[i])*p^(j-i+1)

并查集

并查集是一个集合,可以查询节点是否在一个集合中

令fa[i]表示x在它所在的树上的父亲,特殊的,根节点的父亲是他自己

我们要查询a和b是否在一个集合中,只需要不停令他们等于他们的父亲,直到根节点,然后看看根节点是否相等就好了

如果要把两个集合合并,我们要先找到这两个集合的根,然后令一个的父亲等于另一个

路径压缩:

我们发现并查集这个东西完全没有必要保留树的结构,所以我们可以让这个集合里面的点的父亲直接指向它的代表源

int father(int x)

{

    return fa[x]==x? x: fa[x]=father(fa[x]);

}

树状数组:支持单点修改,前缀查询

主要应用:线段树常数过大时,线段树功能过多时

注意查询是-lowbit,修改是+lowbit

int lowbit(int x){
return x&(-x);
} void modify(int x,int y){
// add y to a[x]
for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y;
} int query(int x){
// sum of a[1]...a[x]
int ret=;
for(int i=x;i;i-=lowbit(i)) ret+=c[i];
return ret;
} int query(int l,int r){
return query(r)-query(l-);
}

树状数组所求的所有问题必须存在逆元

线段树

支持区间修改,区间查询

主要应用:一类区间修改区间查询的问题

结构:

单点修改:

  1. 确定点的位置
  2. 更新树的权值

区间查询:

任何一段线段都可以被log n 条线段表示出来,然后把区间上的信息进行处理就好了

区间修改:

我们搞一个懒标记,每一次对一个完整的区间节点修改的时候就打上懒标记,然后把懒标记下放

下放懒标记:

首先,如果没有懒标记就不需要下放

然后,把他的两个儿子的懒标记加上父亲的懒标记,在对应的对sum进行修改

最后,把他的父亲的懒标记删掉

什么时候下放懒标记?

什么时候碰到这个节点就下放

例题:

中位数

维护两个堆,大根堆和小根堆,大根堆n/2+1个元素,小根堆n/2个元素,每次加入两个元素到大根堆里,然后把大根堆的堆顶给到小根堆,这样大根堆的堆顶就是中位数

树的重构

对每一个点算出一个hash,如果两个集合完全相同,就是重构的

怎么求树的hash?

对一个节点的hash排序,然后搞一搞

对于一棵无根树,他的重心(所有子树中最大的子树节点数最少)个数不为2

或者枚举每个重心

括号序列,每个封闭的括号代表一个节点。如何把树转换成括号序列?

递归处理,把点的所有子树的括号序列按照字典序排序,括号序列字典序最小的就再加一个括号

qbzt day3 上午的更多相关文章

  1. QBZT Day3(zhx ak IOI)

    动态规划 DP和前几天学的东西不大一样,动态规划和数据结构相比是一个非常抽象的东西 先来看看斐波那契数列 定义是F0=0,F1=1,Fn=F(n-1)+F(n-2) 0,1,1,2,3,5,8,13, ...

  2. Day3上午解题报告

    预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...

  3. qbzt day7上午

    由于优盘咕咕咕了,所以这篇就咕咕咕了 以后还会补上的 qwq

  4. qbzt day6 上午

    还是合并石子,但是这次可以任意两个合并,并且求最大异或和 f[s]表示把s所对应的的石子合并为一堆的最小代价 最后求f[2^n-1] 怎么转移? 最后一次也是把两堆合并成一堆,但是会有很多情况,可以枚 ...

  5. qbzt day5 上午

    动态规划 递推  递归   记忆化搜索 斐波那契数列 1.用其他已经计算好的结果计算自己的结果(递推) 2.用自己的值计算别人的值(考虑对之后的项做出的贡献) cin >> n; f[]= ...

  6. qbzt day4 上午

    图论 最短路:dijkstra   spfa   floyd 最小生成树:kruskal 连通性:bfs/dfs    tarjan(强连通分量) 其它:拓扑排序    LCA 齿轮: 图的dfs树只 ...

  7. qbzt day3 晚上 平衡树的一些思想

    pks大佬的blog 二叉查找树 任何一个节点左子树的所有元素都小于这个节点,右子树的所有元素都大于这个节点 查找一个节点:从根节点开始,比他小就向左走,比他大就向右走 平衡树:解决二叉查找树的一些痛 ...

  8. qbzt day3 下午(好难)

    内容提要 有关数据结构的例题 求逆序对数 统计每个数前面有多少比他大的数 开数组表示这个数之前0~9这些数出现了几次 动态将某个点加一,动态求前缀和 用树状数组 如果数太大了怎么办? 离散化 步骤:先 ...

  9. qbzt day2 上午

    内容提要 贪心 分治 分块 搜索 接着昨天的讲 过河问题 考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题 那么最后 ...

随机推荐

  1. [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)

    [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...

  2. 如何通过PHP将excel的数据导入MySQL中

    在开发PHP程序时,很多时候我们会有将数据批量导入数据库的需求,如学生信息批量添加到数据库中,而事先用excel编排好,对excel实行操作,便是我们比较常用的选择方式. 在对excel的操作中,ph ...

  3. 08: mysql主从原理

    1.1 mysql主从同步   参考博客:https://www.cnblogs.com/kevingrace/p/6256603.html 1.mysql主从同步(复制)概念 1. 将Mysql某一 ...

  4. [LeetCode] 82. 删除排序链表中的重复元素 II

    题目链接 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 题目描述: 给定一个排序链表,删除所有含有 ...

  5. IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)(转载)

    创建parent项目 1.打开IDEA,注意这里不要勾选模板,用模板创建过maven项目的小伙伴都知道模板创建项目非常慢,所以这里不要选模板,需要的文件夹我们后面自己来创建就可以了.所以这个页面直接点 ...

  6. 3-6如何在一个for语句中迭代多个可迭代对象

    1.并行迭代 迭代元组可以进行拆包迭代. >>> zip([1,2,3,4],('a','b','c','d')) [(1, 'a'), (2, 'b'), (3, 'c'), (4 ...

  7. bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)

    内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...

  8. mysql,oracle,sql server数据库默认的端口号,端口号可以为负数吗?以及常用协议所对应的缺省端口号

    mysql,oracle,sql server数据库默认的端口号? mysql:3306 Oracle:1521 sql server:1433 端口号可以为负吗? 不可以,端口号都有范围的,0~65 ...

  9. 1-ES简单介绍

    一.ES简单介绍 ES:Elastic Search,一个分布式.高扩展.高实时的搜索与数据分析引警.它可以准实时地快速存储.搜索.分析海量的数据. 1.ES实现原理 a.用户数据提交到ES数据库中 ...

  10. tr 替换或删除字符

    1.命令功能 tr 从标准输入中替换,压缩间隔或者删除字符并从定向到标准输出. 2.语法格式 tr  option  SET1  SET2 参数 参数说明 -c 取代所有SET1中字符串 -d 删除所 ...