CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)
·栈、单调栈
1.栈的特点与基本操作
2.单调栈
单调栈是一种特殊的栈,其栈内的元素都保持一个单调性(单调递增或者递减)。
·单调递增栈,从栈底到栈顶依次递增(单调非递减栈:允许有相等)
·单调递减栈,从栈底到栈顶依次递减(单调非递增栈:允许有相等)
qes1.给一个序列,求对于每个数左边第一个比它大的数
做法:维护一个单调栈
①如果当前栈顶的元素比自己小,则将栈顶元素不断弹出,直到遇到第一个比自己大的元素,即为左边第一个比自己大的数
②如果一直弹出直到栈空了,则无法找到左边比自己大的元素
③将自己加入栈顶
更具体做法可参见:https://blog.csdn.net/Floraqiu/article/details/81947461
·笛卡尔树
qes1.求每段区间最小值的和
做法:笛卡尔树
一些性质:
①堆的性质,小根堆,两子的值大于等于父亲的值
②二叉搜索树性质,即左子树的点key(默认为下标)比根小,右子树的点key(默认为下标)比根大显然(增量法构造),按中序遍历这棵树,可得原序列
③询问下标i到下标j之间(i<j)的最小值,只需寻找[i,j]的lca
④修改只会在最右边的一条链上修改,左子树不会再修改。并且右边的链相当于一个栈,出栈的元素进入左子树
以某元素为最小值的区间长度为:(sizeL+1)*(sizeR+1)
参考链接:https://blog.csdn.net/Code92007/article/details/94591571
·队列、单调队列
qes1.求所有区间长度为k的区间的最大值
做法:单调队列(与单调栈类似)
①插入:若新元素从队尾插入后会破坏单调性,则删除队尾元素,直到插入后不再破坏单调性为止,再将其插入单调队列。
②获取最优(最大、最小)值:访问首尾元素
③队首元素超过其存活期则应该弹出
·STL
1.Vecotor,stack,queue
2.set,map,priority_queue
①set支持insert(),erase()操作
②upper_bound(),lower_bound()不可直接使用,要加上s.lower_bound()
③map<int,int> x 等价于 set<pair<int,int>>
3.multiset
①支持可重复元素
②erase()操作删除所有相同的元素
③ 对于序列[1,1,2,3,4,4,5] :lower_bound()找到第一个4,upper_bound()找到第二个4
④对于③中的序列要想只删除多个4中的一个:s.earse(lower_bound(4))
4.unordered_map,unordered_set
①无法使用upper_bound()与lower_bound()
②可在o(1)复杂度内询问元素是否在集合内(本质为哈希表)
qes1.维护一个几个集合,支持插入一个数,删除一个数,求所有数从小到大排序之后的异或和
做法:先将所有元素排序,之后将两两相邻的元素的异或关系加入集合中
删除:将被与删除元素与其相连的两个元素之间的关系删除,再加入与其相连的两个元素新形成的关系
插入:用lower_bound()找到元素对应位置,删除原先的关系,加入新的关系
·树上倍增
qes1.求一个点往上第K个祖先
做法:树上倍增
定义数组fa[i][j]表示i节点的第2^j个父亲是谁。
然后,我们会发现有这么一个性质:
fa[i][j]=fa[fa[i][j-1]][j-1]
用文字叙述为:i的第2^j个父亲 是i的第2^(j-1)个父亲的第2^(j-1)个父亲
例.假设求u的第11个父亲:
①将11转化为二进制1011
②u->f(u,3)->f(u,1)->f(u,0)
qes2.求LCA
①如果两点高度(即深度)相同
for k = log(n) to 0
if f(u,k)=f(v,k)
continue
else
u=f(u,k)
v=f(v,k)
②如果两点高度不相同,先将低的点跳到与高的点深度相同
qes3.求两点之间路径的最大值
思路:倍增的同时记录下g(u,j)=max(g(u,j-1),g((f(u,j-1),j-1))
qes4.有若干个操作,每次将一条路径上的边全部加上一个值,操作完之后求每条边的权值
与qes3类似,所有可以合并的信息都能用点三的信息求出
·ST表
1.RMQ
一个高效的用于查询区间最大/最小值的方法,其需要O(nlogn))的时间复杂度进行预处理,之后对于每次的区间查询的复杂度为O(1)。
预处理
设mn[i][j]表示从第i位开始连续2^j个数中的最小值。例如mn[2][1]为第2位数开始连续2个的数的最小值,即3, 6之间的最小值,即mn[2][1] = 3;
之后我们很容想到递推方程:
mn[i][j] = min(mn[i][j - 1], mn[i + (1 << j - 1)][j - 1])
查询
假设我们需要查询区间[l, r]中的最小值,令k = log2(r - l + 1); 则区间[l, r]的最小值RMQ[l,r] = min(mn[l][k], mn[r - (1 << k) + 1][k]);
2.RMQ求LCA
①概念
时间戳 - 该结点dfs首次遍历到的序号,用记录。
欧拉序 - dfs遍历节点,节点的编号形成的序列,用记录。(包括回溯)
②在欧拉序上进行RMQ:
表示与对应的节点编号,也就是这个节点的LCA。
LCA在之间(闭区间)且是其中深度最小的节点,这是显然的:(设 )
有两种情况,是的祖先,此时向下遍历一定会到达;
不是的祖先,由于树上路径的唯一性,在到达后必然会退出,经过,到达。
①先将所有集合内部排序
②每次暴力合并把小集合的合并到大的里
看起来很暴力的一个做法,但是时间复杂度只有(nlogn)
伪代码:
merge(a,b)
size(a)>size(b) //交换两个集合a.swap(b)
for x :b
a.insert(b)
qes2.求出每个子树的众数
做法:DSU On Tree(树上启发式合并),dfs到某一个点,将其子树的所有点合并,求集合中的众数
子树问题:一个元素都是单独的一个集合
伪代码:
dfs(u)
Sa={Bu}
for v:son[u]
dfs(v)
su=Sa U Sv
·Segement beats(吉如一线段树)
详细博客:https://oi-wiki.org/ds/seg-beats/#ctsn-loves-segment-tree
qes1.给一个序列,支持区间取min,然后询问区间max,区间和(HDU5306 Gorgeous Sequence)
做法:维护区间最大值Max,次大致Se,区间和Sum以及最大值个数Cnt,现在考虑如何对区间取min
①如果Max≤t ,显然这个t是没有意义的,直接返回
②如果 Se < t ≤ Max 那么这个t就能更新当前区间中的最大值。于是我们让区间和加上 Cnt (t-Max),然后更新 Max为t ,并打一个标记
③如果t ≤ Se,那么这时你发现你不知道有多少个数涉及到更新的问题。于是我们的策略就是,暴力递归向下操作。然后上传信息
以上就是讲了并且听懂了的内容哈哈哈,下面放上没讲或者没听懂的问题,以后来补哈哈哈
·线段树分治
qes1.动态图支持加边与删边操作,询问连通性,可以离线
·DFS序
qes1.每个点有f个值,每个点的g值为子树的f值之和。支持修改f值,询问子树g值的和
qes2.给你一颗树,边权可能是负数,要求查询u这个点到v这个子树里的最远点
·主席树
qes1.二位数点,强制在线
qes2.区间查询第K大
qes3.求树上两点之间的第K大
qes4.给你一序列a1,a2,...,an。给Q个询问,每次给出l,r,x求l,r之间与x异或之后最大的数
·CDQ分治
qes1.三维数点
qes2.一个图,对于所有i,j,k求出从i到j不经过k的最短路长度
CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)的更多相关文章
- Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
题目: In some social network, there are nn users communicating with each other in mm groups of friends ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2020 CCPC-Wannafly Winter Camp Day2
2020 CCPC-Wannafly Winter Camp Day2 A 托米的字符串 虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理.计算出某一长度的情况下,元音字 ...
- Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...
- 牛客网补题 New Game!(原Wannafly summer camp day2原题)
思路:这个题在秦皇岛的时候好像没有写出来,反正我是没有写出来,题解是听懂了:把直线和圆都看做一个结点,圆和直线用点到直线的距离与半径差求出来,圆和圆之间用点和点之间的距离和半径差表示,最后最短路跑一遍 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
随机推荐
- 机器学习——集成学习之Boosting
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 AdaBoost GB ...
- LINUX内核参数调优集锦
1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 1.linux内核参数注释 以下表格中红色字体为常用优化参数 根据参数文件所处目录不同而进行分表整理 下列文件所在目录: ...
- Spring Security 学习笔记-信道过滤器
信道过滤器主要职责是拦截不合规则的http请求,比如规定只能通过https访问资源,那么信道拦截器做相应的拦截处理,把http请求重定向为https请求,https请求则不做任何处理. 配置方式参照: ...
- vue-learning:8-template-v-on-and-modifier
绑定元素事件的指令 v-on 及事件和修饰符 目录 对比原生事件绑定.jQuery事件绑定 Vue事件绑定 Vue绑定事件中获取事件对象event 事件修饰符 事件行为修饰符: stop / prev ...
- 两种方法,轻松上手ConfigMap!
属性配置文件在任何应用程序中都非常重要.它们不仅可以让应用程序具备灵活性,还能够根据文件中配置的值产生不同的功能.实际上,在staging.开发.测试.UAT或生产环境中,我们都使用属性配置文件来驱动 ...
- Blazor 服务端组件 Render, RenderFragment ,RenderTreeBuilder, CascadingValue/CascadingParameter
一.组件 支撑Blazor的是微软的两大成熟技术,Razor模板和SignalR,两者的交汇点就是组件.通常,我们从ComponentBase派生的类型,或者创建的.razor 文件,就可以称作组件. ...
- RobotFramework+Appium 为了兼容iOS12,升级至Xcode10后,WebDriverAgent编译不通过:Undefind symbols for architecture x86_64
报错信息如下: Undefined symbols for architecture arm64: "_OBJC_CLASS_$_XCElementSnapshot", refer ...
- Visio图像应用
图像插入: 直接搜索然后插入 CAD是工程绘图. CAD属性设置框 下面是图像编辑: 通过格式中的旋转进行调整 但是CAD格式的图没有格式 图片可以设置题注 图片层次的使用 CAD图片颜色的修改在 图 ...
- 【题解】地精部落(DP)
[题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...
- Spring命令行参数
一般我们通过java -jar xxx.jar的方式启动应用,其实除了启动应用我们还能在命令中指定应用的参数,比如java -jar xxx.jar --server.port=1234,直接以命令行 ...